go cmd/compile:匿名结构体在二进制中占用空间

polkgigr  于 6个月前  发布在  Go
关注(0)|答案(8)|浏览(57)

匿名结构体在编译后的二进制文件中占用相当大的空间。由于匿名结构体没有合适的名称,因此使用完整的匿名结构体描述作为名称。

作为一个快速的实验,通过将Go编译器中的一些匿名结构体替换为命名类型,编译器缩小了14KB,而gofmt缩小了10KB。

作为一个极端的例子:通过更改以下代码:

go/src/runtime/mgc.go
第945行 [553a862](https://github.com/golang/go/commit/553a8626ba04981d362ee5937583d2592b305eae)
|  | varworkstruct { |

将其替换为一个命名类型,编译器的二进制文件缩小了约5KB。

jk9hmnmh

jk9hmnmh2#

这可能有助于较小的二进制文件。
/cc @josharian@randall77

vybvopom

vybvopom3#

我们是否可以将所有字段作为名称的一部分,而不是添加变量包路径和变量名称,并添加一个仅由编译器生成的前缀或后缀?

zbwhf8kr

zbwhf8kr4#

这可能对@bradfitz也很有趣,尤其是运行时示例节省了5KiB。

z2acfund

z2acfund5#

@martisch,为了澄清一下,我不是提议手动修复所有这些问题:D。这是编译器/链接器可以做的事情。是的,我的想法也是类似的,A)使用变量名代替字符串描述,或者B)在需要时动态生成名称并在二进制中使用一些哈希值。

pengsaosao

pengsaosao6#

我们刚刚显著地改进了这个问题!提交44d2286删除未使用的类型描述符,这意味着这些长符号名称和其他许多东西不再出现在二进制文件中。这将cmd/compile缩小了140 KiB。
仍然有更多可以做的事情。如果你在一个接口中放入一个大型匿名类型,链接器仍然会提取类型描述符和所有这些大型符号名称。在我们要在链接器中探索的事情列表(不适用于1.15)中,是使用结构哈希来命名和去重类型符号。当然,缺点是二进制文件中的类型符号名称变得不那么有用信息。

5anewei6

5anewei67#

在1.15版本中,我们已经修复了很多问题,因此现在要转向未计划的版本。对于链接器来说,进一步的改进也已列入计划,但这涉及到需要进行权衡的问题。

nom7f22z

nom7f22z8#

我可以确认,在提示中,_work 示例通过约500字节减少了编译器大小。

相关问题