clang忽略属性noinline

mrk*_*rks 6 c++ inline clang

我希望__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();
}
Run Code Online (Sandbox Code Playgroud)

使用构建时-O3,gcc发出inner_noinline,但不会发出inner_inline

(anonymous namespace)::inner_noinline():
        mov     eax, 3
        ret
main:
        call    (anonymous namespace)::inner_noinline()
        add     eax, 4
        ret
Run Code Online (Sandbox Code Playgroud)

Clang坚持对其进行内联:

main: # @main
  mov eax, 7
  ret
Run Code Online (Sandbox Code Playgroud)

如果在函数中添加参数并让它们执行一些琐碎的工作,则clang尊重noinline属性:https ://godbolt.org/z/NNSVab

noinline不应该与功能的复杂程度无关吗?我想念什么?

Sne*_*tel 5

__attribute__((noinline))防止编译器内联函数。它不会阻止它不断折叠。在这种情况下,编译器能够识别出不需要进行调用inner_noinline,无论是作为嵌入式插入还是作为离线调用。它可以只用常数替换函数调用3

听起来您想改用该optnone属性,以防止编译器甚至应用最明显的优化(如本例所示)。