我希望将__attribute__((noinline))
添加到函数中时,可以确保该函数被发出。这适用于gcc,但clang似乎仍可以对其进行内联。
这里是一个示例,您也可以open on Godbolt:
namespace {
__attribute__((noinline))
int inner_noinline() {
return 3;
}
int inner_inline() {
return 4;
}
int outer() {
return inner_noinline() + inner_inline();
}
}
int main() {
return outer();
}
使用-O3
构建时,gcc发出inner_noinline
而不发出inner_inline
:
(anonymous namespace)::inner_noinline():
mov eax, 3
ret
main:
call (anonymous namespace)::inner_noinline()
add eax, 4
ret
Clang坚持对其进行内联:
main: # @main
mov eax, 7
ret
如果在函数中添加参数并让它们执行一些琐碎的工作,则clang尊重noinline属性:https://godbolt.org/z/NNSVab
noinline是否应该独立于功能的复杂程度?我想念什么?
答案 0 :(得分:3)
__attribute__((noinline))
防止编译器内联函数。它不会阻止它不断折叠。在这种情况下,编译器能够识别出不需要以内联插入或外联调用的方式来调用inner_noinline
。它可以只用常量3
代替函数调用。
听起来好像您想使用optnone
属性,以防止编译器甚至应用最明显的优化(如本例所示)。