成员函数之前的大小通常没有内联
How big before a member function typically not inlined?
在编译器决定不内联成员函数之前,成员函数需要多大?
(假设GCC和o2/o3或任何其他高优化开关)。
我认为函数越大,内联的好处就越小。
内联的主要目的之一是避免函数调用和返回的开销。小函数,如getter和setter,是主要的候选函数。
较大的函数通常不内联。这是由于数据处理指令与调用和返回开销的大小之比。与函数中的内容相比,开销很小。一般来说,删除函数调用和返回开销对程序性能的影响可以忽略不计。
至于大小阈值,它取决于编译器。对于GCC,您应该查阅文档或查看代码中的决策点。
gcc inline的默认阈值大小是600。你可以通过标记-finline-limit
注意函数大小的度量不是直接以字节或指令计数计算的,而是由编译器应用的其他度量,这使得很难确定函数是否内联。您可以假设基于函数对特定-finline-limit
值的内联性,其他大小的函数对标志的其他值的内联性。
然而,大小本身并不能保证内联,并且决定可能因其他标志/编译器版本而异。
这种混乱有一个很好的原因:因为内联主要是由于性能,编译器调整它的测量目标架构/函数的使用。
源:
GCC优化选项
相关文章:
- 函数调用在常量表达式中必须具有常量值
- 无法赋值,因为函数'operator[]'返回常量值
- 编译器错误:函数调用在常量表达式中必须有一个常量值
- 非常量引用返回函数在常量值返回函数上用作 r 值
- C++ 函数匹配和恒常性
- 如何忽略函数模板中的恒常性?
- 删除模板化函数中的恒常性
- 函数返回样式合乎逻辑,没问题
- 没有空构造函数的编译失败
- 如何在从用户获取输入后在函数中使用常量值
- C++:在函数内部声明数组时,表达式必须具有常数值
- 返回常量值的函数
- 为什么move构造函数既没有声明也没有用clang删除
- C2057构造函数初始化列表中的常量值定义出错
- 自定义字符串实现中 c_str() 函数中的恒常性问题
- C++构造函数调用 boost::文件系统::p ath 作为参数 - 什么也没发生
- 使用C++中的模板函数确定恒常性
- 将任意数据传递给没有空指针的函数
- 简单的 constexpr 函数无法使用 GCC 编译(clang 没问题)
- 返回常量值的函数对象