使用-O3编译时,将函数标记为内联
Marking a function as inline when compiling with -O3?
C++允许您用inline
关键字注释函数。据我所知,这为编译器提供了内联函数的提示(但没有义务),从而避免了小的函数调用开销。
我有一些方法经常被调用,所以它们真的应该被内联。但是inline
注释的函数需要在头中实现,所以这使得代码的排列不太好。此外,我认为内联是一种编译器优化,应该在有意义的地方对程序员透明地进行。
那么,我必须用inline
注释我的函数才能进行内联吗?或者,当我用-O3
或其他适当的优化标志编译时,GCC在没有注释的情况下解决了这个问题吗?
inline
只是对编译器的一个建议是不正确的&具有误导性。内联标记函数有两种可能的影响:
- 将函数定义内联替换为进行函数调用的位置&
- 某些放宽w.r.t一个定义规则,允许您在头文件中定义函数
编译器可以执行也可以不执行#1
,但必须遵守#2
。所以内联不仅仅是一个建议。一旦函数被标记为内联,就会应用一些规则。
一般来说,不要为了优化而将函数标记为inline
。大多数现代编译器都会在没有您帮助的情况下自行执行这些优化。如果希望将函数包含在头文件中,请将其标记为inline
,因为这是在不破坏ODR的情况下将函数定义包含在头中的唯一正确方法。
常见的民间传说是,gcc总是自己决定(基于一些成本启发式)是否内联(取决于编译器/链接器选项,它甚至可以在链接时这样做)。您有时可以在使用-Winline时观察到这一点,其中gcc警告内联提示被忽略,它甚至经常给出原因。
如果你想知道到底发生了什么,你可能必须阅读它的源代码,或者接受读过它的人的话。
相关文章:
- 如何使用Rcpp将R函数转换为C++函数
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- C++ 如何将数组值解压缩为函数参数
- 为函数定义符号不明确的指针参数
- 将字符缓冲区强制转换为函数指针
- 为什么编译器将其解析为函数指针而不是递归调用?
- 需要 :: 为函数指定类而不是变量?
- C++函数转换为 C# 函数
- 内联扩展编译为函数调用 [C++]
- 我可以动态创建新地图并作为函数参数传递吗?
- 如何为C++函数指定 noexcept ?
- c++ 将函数参数(带有模板变量的结构)转换为函数体内的字符串
- 为什么没有为函数参数删除副本
- 变量是否会自动转换为函数所需的类型作为适当的参数
- 错误:为函数__THROW__asm提供了初始化程序
- 如何将 void* 转换为函数指针?
- 将 cmake 代码段转换为函数 - 不起作用
- 在为函数编写单元测试时,我应该模拟所做的内部函数调用吗?
- 构造函数解释为函数调用,并显式跳过移动构造函数
- 如何将char数组声明为函数参数?或告诉我此代码中还有其他问题?