gpt4 book ai didi

templates - GCC(/Clang) : Merging functions with identical instructions (COMDAT folding)

转载 作者:行者123 更新时间:2023-12-03 10:16:38 27 4
gpt4 key购买 nike

只是好奇,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,但如果不是,则应该可以在组合函数之前放置大量无操作指令并使每个不同的实例化开始于不同的指令,因此它们具有不同的地址。编辑:金的--icf=safe选项只为可以证明没有使用其地址的函数启用 ICF,因此依赖于不同地址的代码仍然可以工作。

ICF 是一种巧妙的优化,但不是必需的。通过一些努力,您可以将非依赖代码提升到非模板或具有较少参数的模板,以减少可执行文件中重复代码的数量。在 Diet Templates 的幻灯片中有更多关于此的信息。几年前我做过的谈话。

关于templates - GCC(/Clang) : Merging functions with identical instructions (COMDAT folding),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15168924/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com