只是好奇,GCC或Clang工具集目前是否实现了等效于MSVC的identical COMDAT folding(ICF)?如果没有,有什么计划吗?除了旧的GCC邮件列表消息外,我似乎找不到其他有关该主题的权威链接。
如果不是,这是否意味着针对不同类型的模板实例化在生成的二进制文件中始终是不同的函数(在它们未完全内联的情况下),即使它们与二进制文件兼容,或者是否有其他机制可以处理此问题。在其他水平?
另外,有没有人发现ICF在实践中最大程度地减少了生成的可执行文件的大小?我没有任何大型的MSVC项目可以方便地对其进行测试。 (我猜想,如果您碰巧实例化了许多不同的vtable-layout兼容类型的模板,那只会真正有帮助。)
最后,是否符合C++ 11标准的两个函数指针指向不同的函数在运行时进行相等比较? This link似乎暗示不是,但它适用于C99。编辑:found previous question on this topic
最佳答案
GCC和Clang都不是链接器,ICF需要由链接器完成,或者至少与链接器合作。编辑:他们不执行ICF,所以是的,不同的实例产生不同的代码。 GNU gold
链接器通过--icf
选项支持ICF,这需要使用GCC选项-ffunction-sections
。
不同的函数必须具有不同的地址...我不记得是否为任何已获取其地址的函数禁用了ICF,但如果没有,则应该可以在组合函数之前放置一些无操作指令,并让每个不同的实例化从不同的指令开始,因此它们具有不同的地址。编辑:gold的--icf=safe
选项仅对那些被证明没有采用其地址的功能启用ICF,因此依赖于不同地址的代码仍将起作用。
ICF是一个整洁的优化,但不是必需的。只需付出一点努力,您就可以将非依赖代码提升到一个非模板或参数较少的模板中,以减少可执行文件中重复代码的数量。几年前我在Diet Templates演讲的幻灯片中有关于此的更多信息。