侧边栏壁纸
博主头像
如此肤浅

但行好事,莫问前程!

  • 累计撰写 52 篇文章
  • 累计创建 6 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录

条款30 透彻了解 inlining 的里里外外

如此肤浅
2022-06-05 / 0 评论 / 0 点赞 / 22 阅读 / 832 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-06-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1. 将大多数 inlining 限制在小型、被频繁调用的函数身上。这可使日后的调试过程和二进制升级(binary upgradability)更容易,也可使潜在的代码膨胀问题最小化,使程序的速度提升机会最大化。
2. 不要只因为 function templates 出现在头文件,就将它们声明为 inline。

inline 函数定义的关键字,说明该函数是内联函数。内联函数会将代码块嵌入到每个调用该函数的地方。内联函数减少了函数的调用,使代码执行的效力提高,但是会增加目标代码的大小,最终会使程序的代码段占有大量的内存。

因此,inline 更适用于函数体比较小的代码。记住,inline 只是对编译器的一个建议,不是使用了 inline 关键字就一定会变成 inline 函数,最终结果取决于编译器。 在大部分编译器中,如果它们无法将你要求的函数 inline 化,它们会给你一个警告信息(见条款53)。

inline 函数通常一定被放在头文件内,因为大多数的环境都在编译过程中进行 inlining,而为了将函数体编译进函数调用的位置,编译器必须知道这个函数长什么样子。

template<typename T>
inline const T& std::max(const T& a, const T& b)
{ return a < b ? b : a; }

templates 通常也被置于头文件内,因为它一旦被使用,编译器为了将它具现化,需要知道它长什么样子。

但 template 的具现化与 inlining 无关。如果你正在写一个 template 而你认为所有根据此 template 具现出来的函数都应该 inlined,请将此 template 声明为 inline;这就是上述 std::max 代码的做法。但如果你写的 template 没有理由要求它所具现的每一个函数都是 inlined,就应该避免将这个 template 声明为 inline(不论显式或隐式),因为 inlining 会使代码发生膨胀,且还会产生其他成本。

0

评论区