GCC(/锵):具有相同的指令合并功能(COMDAT折叠)(GCC(/Clang): Merging

2019-07-20 19:26发布

只是好奇,做GCC或锵工具集实现MSVC的相当于相同COMDAT折叠 (ICF)目前? 如果不是,是否有任何计划? 我似乎无法找到最近上比老GCC邮件列表信息等主题的任何权威的链接。

如果不是,这是否意味着模板实例在不同的类型是生成的二进制总是不同的功能(在的情况下,他们还没有完全内联),即使他们是二进制兼容的,还是有其他的机制就地处理这在一些其他的水平?

另外,有没有人发现ICF使得在实践中最小化生成的可执行文件的大小大的差别? 我没有任何大的MSVC项目,方便对其进行测试。 (我猜它才真正帮助,如果你碰巧在许多不同的虚函数表布局兼容的类型来实例化模板。)

最后,它的C ++符合标准11为两个函数的指针功能的不同来比较在运行时等于? 此链接似乎在暗示,它不是,但它是C99。 编辑: 发现前面的问题在这个题目

Answer 1:

无论是GCC也不锵是接头,和ICF需要链接器来完成,或者至少与链接合作。 编辑: 他们不这样做ICF,所以是的,不同的实例产生不同的代码。 在GNU gold接头支持与ICF --icf选项,这需要GCC选项-ffunction-sections中使用。

不同的功能,必须有不同的地址...如果ICF是针对已经采取了地址的任何功能禁止我不记得,但如果没有它应该有可能把无操作的负载组合功能的指令之前,使各独特的实例在不同的指令开始,所以他们有不同的地址。 编辑:黄金的--icf=safe选项仅启用Windows防火墙,可以证明不具有采取他们的地址功能,使依赖于不同的地址代码仍然可以工作。

ICF是一个整洁的优化,但不是必需的。 随着一点点的努力,你可以吊出非依赖代码到一个非模板,或用较少的参数模板,以减少可执行文件的重复代码的数量。 有关于这方面的幻灯片获得更多的信息饮食模板谈我几年前一样。



文章来源: GCC(/Clang): Merging functions with identical instructions (COMDAT folding)