匿名结构体在编译后的二进制文件中占用相当大的空间。由于匿名结构体没有合适的名称,因此使用完整的匿名结构体描述作为名称。
作为一个快速的实验,通过将Go编译器中的一些匿名结构体替换为命名类型,编译器缩小了14KB,而gofmt缩小了10KB。
作为一个极端的例子:通过更改以下代码:
go/src/runtime/mgc.go
第945行 [553a862](https://github.com/golang/go/commit/553a8626ba04981d362ee5937583d2592b305eae)
| | varworkstruct { |
将其替换为一个命名类型,编译器的二进制文件缩小了约5KB。
8条答案
按热度按时间eh57zj3b1#
@aclements
jk9hmnmh2#
这可能有助于较小的二进制文件。
/cc @josharian@randall77
vybvopom3#
我们是否可以将所有字段作为名称的一部分,而不是添加变量包路径和变量名称,并添加一个仅由编译器生成的前缀或后缀?
zbwhf8kr4#
这可能对@bradfitz也很有趣,尤其是运行时示例节省了5KiB。
z2acfund5#
@martisch,为了澄清一下,我不是提议手动修复所有这些问题:D。这是编译器/链接器可以做的事情。是的,我的想法也是类似的,A)使用变量名代替字符串描述,或者B)在需要时动态生成名称并在二进制中使用一些哈希值。
pengsaosao6#
我们刚刚显著地改进了这个问题!提交44d2286删除未使用的类型描述符,这意味着这些长符号名称和其他许多东西不再出现在二进制文件中。这将cmd/compile缩小了140 KiB。
仍然有更多可以做的事情。如果你在一个接口中放入一个大型匿名类型,链接器仍然会提取类型描述符和所有这些大型符号名称。在我们要在链接器中探索的事情列表(不适用于1.15)中,是使用结构哈希来命名和去重类型符号。当然,缺点是二进制文件中的类型符号名称变得不那么有用信息。
5anewei67#
在1.15版本中,我们已经修复了很多问题,因此现在要转向未计划的版本。对于链接器来说,进一步的改进也已列入计划,但这涉及到需要进行权衡的问题。
nom7f22z8#
我可以确认,在提示中,
_work
示例通过约500字节减少了编译器大小。