汇编函数具有相同的名称,后缀为 ..0 和 ..1
Assembly functions have same name with suffix ..0 and ..1
我正在查看一些已编译代码的汇编,在搜索特定函数时,我找到了两个共享相同名称的函数:
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 中有一些注释。 (如果您 google,请尝试搜索“函数克隆编译器”或“过程克隆编译器”,否则会搜索到很多名为“功能克隆”的分子生物学概念。)
虽然上面的 link 是针对 gcc 的,但其他编译器也支持它。对 -O3
的引用表明您所讨论的编译器可能是 clang,它肯定具有这样的功能。
我正在查看一些已编译代码的汇编,在搜索特定函数时,我找到了两个共享相同名称的函数:
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 中有一些注释。 (如果您 google,请尝试搜索“函数克隆编译器”或“过程克隆编译器”,否则会搜索到很多名为“功能克隆”的分子生物学概念。)
虽然上面的 link 是针对 gcc 的,但其他编译器也支持它。对 -O3
的引用表明您所讨论的编译器可能是 clang,它肯定具有这样的功能。