时间:2010-07-25 12:36:56

标签: c++ visual-c++

9 个答案:

答案 0 :(得分:47)

答案 1 :(得分:40)

答案 2 :(得分:13)

答案 3 :(得分:4)

答案 4 :(得分:4)

[[gnu::noinline]]属性

我们还可以将C ++ 11属性说明符语法与非标准的gnu::noinline属性一起使用:https://en.cppreference.com/w/cpp/language/attributes

gnu::部分被废除以后的C ++标准以提供标准化的[[noinline]]只是时间问题:-)

main.cpp

[[gnu::noinline]]
int my_func() {
    return 1;
}

int main() {
    return my_func();
}

编译和反汇编:

g++ -ggdb3 -O3 -o main.out -std=c++11 -Wall -Wextra -pedantic-errors main.cpp
gdb -batch -ex 'disassemble/r main' main.out

使用[[gnu::noinline]]

   0x0000000000001040 <+0>:     f3 0f 1e fa     endbr64 
   0x0000000000001044 <+4>:     e9 f7 00 00 00  jmpq   0x1140 <my_func()>

没有[[gnu::noinline]]

   0x0000000000001040 <+0>:     f3 0f 1e fa     endbr64 
   0x0000000000001044 <+4>:     b8 01 00 00 00  mov    $0x1,%eax
   0x0000000000001049 <+9>:     c3      retq

在Ubuntu 19.10上测试。

答案 5 :(得分:2)

答案 6 :(得分:1)

答案 7 :(得分:0)

如果它是类的成员函数,请将其设为虚拟。

答案 8 :(得分:-10)