c - 汇编函数具有相同的名称,后缀为 ..0 和 ..1
问题描述
我正在查看一些已编译代码的程序集,在搜索特定函数时,我发现了两个共享相同名称的函数:
000000000042da10 <my_function..0>:
000000000042dc50 <my_function..1>:
这个函数在 C 代码中只有一个声明。我注意到这两个函数在汇编代码中的不同位置被调用,参数略有不同。
这是一个非 gcc 编译器,但我不确定是哪个(我刚刚被告知这不是用 gcc 编译的)。我知道它是用最大优化(-O3)编译的,所以我很好奇这是否是编译器优化整数常量参数并创建函数两次,每次调用一次。
一个程序中存在两个相同功能的原因是什么?
解决方案
我很好奇这是否是编译器优化整数常量参数并创建函数两次,每次调用一次。
很可能。这种优化称为函数克隆,是通过函数调用实现持续传播而无需内联的一种方法。我无法立即找到全面的参考资料,但在影响 gcc 中的功能克隆/复制/常量传播中有一些注释。(如果你用谷歌搜索,请尝试搜索“函数克隆编译器”或“过程克隆编译器”,否则称为“功能克隆”的分子生物学概念有很多热门。)
虽然上面的链接是针对 gcc 的,但其他编译器也支持这个。参考-O3
表明您所讨论的编译器可能是clang,它当然具有这样的功能。
推荐阅读
- python-3.x - 如何使用 gnu 并行编写批处理命令?
- javascript - 如何通过 .isoDate 对 RSS 提要进行排序并保持提要的内容连接(标题和链接)?
- c++ - 在容器中引用?
- r - R在对另一列的完整组合进行分组后,创建具有比例列的汇总数据框
- flutter-web - 有没有办法在flutter web上禁用应用程序下载选项?
- postgresql - postgresql表,可以跳过transactionId管理吗
- angular - 按下按钮时如何向 Angular 添加列表元素?
- scala - 如何从一列选项中过滤掉无?
- java - 自动将 OpenJDK 安装到 SageMaker Notebook
- javafx - javafx webview 无法正确显示 html 页面