我正在查看一些已编译代码的汇编,在搜索特定函数时,我发现了两个共享相同名称的函数:
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/