我想强制一个小函数不被编译为内联函数,即使它很简单。我认为这对于调试目的很有用。有没有关键字可以做到这一点?
原文由 Thomson 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想强制一个小函数不被编译为内联函数,即使它很简单。我认为这对于调试目的很有用。有没有关键字可以做到这一点?
原文由 Thomson 发布,翻译遵循 CC BY-SA 4.0 许可协议
[[gnu::noinline]]
属性
我们还可以将 C++11 属性说明符语法与非标准 gnu::noinline
属性一起使用: https ://en.cppreference.com/w/cpp/language/attributes
gnu::
部分被放弃未来的 C++ 标准以提供标准化的 [[noinline]]
只是时间问题 :-)
主文件
[[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 上测试。
原文由 Ciro Santilli OurBigBook.com 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
在 Visual Studio 2010 中,
__declspec(noinline)
告诉编译器永远不要内联特定的成员函数,例如:编辑:此外,当使用
/clr
编译时,具有安全属性的函数永远不会内联(再次,这是特定于 VS 2010)。不过,我认为它在调试时根本不会有用。