【发布时间】:2018-02-08 15:16:41
【问题描述】:
如果我的项目中根本没有使用外部包中的函数,编译器会从生成的机器代码中删除该函数吗?
这个问题通常可以针对任何语言编译器。但是,我认为这种行为可能因语言而异。所以,我很想知道 Go 编译器是做什么的。
对于理解这一点的任何帮助,我将不胜感激。
【问题讨论】:
标签: go executable
如果我的项目中根本没有使用外部包中的函数,编译器会从生成的机器代码中删除该函数吗?
这个问题通常可以针对任何语言编译器。但是,我认为这种行为可能因语言而异。所以,我很想知道 Go 编译器是做什么的。
对于理解这一点的任何帮助,我将不胜感激。
【问题讨论】:
标签: go executable
语言规范在任何地方都没有提到这一点,从正确性的角度来看,这无关紧要。
但要知道,当前版本确实删除了编译器可以证明未使用且不会改变应用的运行时行为的某些构造。
引用The Go Blog: Smaller Go 1.7 binaries:
第二个变化是方法修剪。直到 1.6,所有使用类型的所有方法都被保留,即使其中一些方法从未被调用。这是因为它们可能通过接口调用,或者使用反射包动态调用。现在编译器会丢弃任何与接口不匹配的未导出方法。类似地,如果相应的reflection features 没有在程序中的任何地方使用,链接器可以丢弃其他导出的方法,那些只能通过反射访问的方法。这种变化将二进制文件缩小了 5-20%。
方法比函数更“难”,因为方法可以通过反射列出和调用(与函数不同),但 Go 工具甚至可以删除未使用的方法。
您可以在此答案中查看已删除/未链接代码的示例和证明:
How to remove unused code at compile time?
另请参阅其他相关问题:
【讨论】: