是否可以强制不内联函数?

新手上路,请多包涵

我想强制一个小函数不被编译为内联函数,即使它很简单。我认为这对于调试目的很有用。有没有关键字可以做到这一点?

原文由 Thomson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

在 Visual Studio 2010 中, __declspec(noinline) 告诉编译器永远不要内联特定的成员函数,例如:

 class X {
     __declspec(noinline) int member_func() {
          return 0;
     }
};

编辑:此外,当使用 /clr 编译时,具有安全属性的函数永远不会内联(再次,这是特定于 VS 2010)。

不过,我认为它在调试时根本不会有用。

原文由 Michael Foukarakis 发布,翻译遵循 CC BY-SA 2.5 许可协议

[[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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题