c - 汇编函数具有相同的名称,后缀为 ..0 和 ..1

标签 c compilation compiler-optimization

我正在查看一些已编译代码的汇编,在搜索特定函数时,我发现了两个共享相同名称的函数:

000000000042da10 <my_function..0>:

000000000042dc50 <my_function..1>:

该函数在 C 代码中只有一个声明。我注意到这两个函数在不同位置的汇编代码中被调用,参数略有不同。

这是一个非 gcc 编译器,但我不确定是哪个(我刚刚被告知这不是用 gcc 编译的)。我知道它是用最大优化(-O3)编译的,所以我很好奇这是否是针对整数常量参数进行优化的编译器并创建该函数两次,每次调用一次。

一个程序中为什么会存在两个相同的函数?

最佳答案

I'm curious if this is the compiler optimizing for integer-constant arguments and creating the function twice, once for each time it's called.

很有可能。这种优化称为函数克隆,是通过函数调用实现持续传播而无需内联的一种方法。我无法立即找到全面的引用资料,但在 Influencing function cloning/duplication/constant propagation in gcc 有一些注释。 。 (如果你用谷歌搜索,请尝试搜索“函数克隆编译器”或“过程克隆编译器”,否则有很多关于“功能克隆”的分子生物学概念的搜索结果。)

虽然上面的链接是针对 gcc 的,但其他编译器也支持这一点。对 -O3 的引用表明您所讨论的编译器可能是 clang,并且它肯定具有这样的功能。

关于c - 汇编函数具有相同的名称,后缀为 ..0 和 ..1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68184801/

相关文章:

c++ - 将 DevC++ 移植到 Linux

c++ - Boost C++ 示例代码 - 静态编译错误

c# - 为什么这种编译方式有所不同?

c++ - 在 C++ 中,如果返回一个指针并立即取消引用,这两个操作是否会被优化掉?

c++ - boost::unordered_map::find 根据编译器优化级别产生不同的结果,而 boost::unordered_map::insert 产生相同的结果

c - avr-gcc 3.4.0 和 avr-gcc 4.3.x 之间的二进制兼容性

c++ - CMake 顶级 Xcode 项目属性

c - 为什么 0 是我动态创建的数组的最后一个值的一个非常常见的整数?

c - 使 gcc 在函数结束时不发出 'ret' 指令

c++ - 我的编译器是否忽略了我未使用的静态 thread_local 类成员?