clang 忽略属性 noinline
clang ignoring attribute noinline
我希望 __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 不应该与函数的复杂程度无关吗?我错过了什么?
__attribute__((noinline))
阻止编译器内联该函数。它不会阻止它不断折叠。在这种情况下,编译器能够识别出不需要调用 inner_noinline
,无论是作为内联插入还是外联调用。它可以用常量 3
.
替换函数调用
听起来您想改用 optnone
属性,以防止编译器应用最明显的优化(就像这个优化一样)。
我希望 __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 不应该与函数的复杂程度无关吗?我错过了什么?
__attribute__((noinline))
阻止编译器内联该函数。它不会阻止它不断折叠。在这种情况下,编译器能够识别出不需要调用 inner_noinline
,无论是作为内联插入还是外联调用。它可以用常量 3
.
听起来您想改用 optnone
属性,以防止编译器应用最明显的优化(就像这个优化一样)。