Ste*_*Lin 27 linker gcc templates clang compiler-optimization
好奇的是,GCC或Clang工具集目前是否实现了相同的MSVC 相同的COMDAT折叠(ICF)?如果没有,有什么计划吗?除了旧的GCC邮件列表消息之外,我似乎无法找到关于该主题的任何最新权威链接.
如果不是,这是否意味着不同类型的模板实例化在结果二进制文件中始终是不同的函数(在它们没有完全内联的情况下),即使它们是二进制兼容的,或者是否存在其他机制来处理它在其他一些水平?
此外,有没有人发现ICF在最大限度地减少实际可执行文件的大小方面有很大的不同?我没有任何大型MSVC项目可以方便地进行测试.(我猜它只是真的有帮助,如果你碰巧在许多不同的vtable-layout兼容类型上实例化模板.)
最后,是否符合C++ 11标准的两个函数指针指向不同的函数,以便在运行时进行相等比较?这个链接似乎意味着它不是,但它适用于C99.编辑:发现此主题的上一个问题
Jon*_*ely 18
GCC和Clang都不是链接器,ICF需要由链接器完成,或者至少与链接器合作完成.编辑:他们不做ICF,所以是的,不同的实例化会产生不同的代码.GNU gold链接器支持带有--icf选项的ICF ,需要使用GCC选项-ffunction-sections.
不同的函数必须具有不同的地址......我不记得是否对任何具有其地址的函数禁用了ICF,但如果没有,则应该可以在组合函数之前加载一些无操作指令并使每个不同的实例化从不同的指令开始,因此它们具有不同的地址.编辑:gold的--icf=safe选项只允许ICF用于可以证明不具有其地址的函数,因此依赖于不同地址的代码仍然可以工作.
ICF是一个简洁的优化,但不是必需的.通过一些努力,您可以将非依赖代码提升到非模板或具有较少参数的模板,以减少可执行文件中重复代码的数量.我在几年前做过的Diet Templates谈话的幻灯片中有更多相关信息.