答案 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)