Я ожидал, что __attribute__((noinline))
при добавлении в функцию, чтобы убедиться, что эта функция испускается.Это работает с gcc, но, похоже, clang все еще встроен.
Вот пример, который вы также можете открыть на 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 не должен быть независимым от сложности функции?Чего мне не хватает?