什么时候使用内联函数,什么时候不使用它? [复制]

2024-04-12

我知道内联是对编译器的提示或请求,用于避免函数调用开销。

那么,根据什么可以确定一个函数是否适合内联呢? 在什么情况下应该避免内联?


避免函数调用的成本只是故事的一半。

do:

  • use inline代替#define
  • 很小函数是很好的候选者inline:更快的代码和更小的可执行文件(更多机会留在代码缓存中)
  • 功能很小and经常打电话

don't:

  • 大函数:会导致更大的可执行文件,这会严重影响性能,尽管调用开销会导致执行速度更快
  • 受 I/O 限制的内联函数
  • 该功能很少使用
  • 构造函数和析构函数:即使为空,编译器也会为它们生成代码
  • breaking binary compatibility when developing libraries:
    • 内联现有函数
    • 更改内联函数或使内联函数成为非内联:以前版本的库调用旧实现

在开发库时,为了使类将来可扩展,您应该:

  • 添加非内联虚拟析构函数,即使主体为空
  • 使所有构造函数成为非内联
  • 编写复制构造函数和赋值运算符的非内联实现,除非类不能按值复制

请记住,inline关键字是对编译器的提示:编译器可能决定不内联函数,也可以决定内联未标记的函数inline首先。我通常避免标记功能inline(除了编写非常非常小的函数时)。

关于性能,明智的方法是(一如既往)分析应用程序,然后最终inline代表瓶颈的一组函数。

参考:

  • 内联或不内联 http://www.ddj.com/architect/184405660
  • [9] 内联函数 http://www.parashift.com/c++-faq-lite/inline-functions.html
  • C++ 的策略/二进制兼容性问题 http://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C++
  • GotW #33:内联 http://www.gotw.ca/gotw/033.htm
  • 内联还原 http://www.ddj.com/cpp/184403879
  • 有效的 C++ - 第 33 条:明智地使用内联

编辑:Bjarne Stroustrup,《C++ 编程语言》:

函数可以定义为inline。例如:

inline int fac(int n)
{
  return (n < 2) ? 1 : n * fac(n-1);
}

The inline说明符是对编译器的一个提示,它应该尝试为调用生成代码fac()内联而不是一次性编写函数代码,然后通过通常的函数调用机制进行调用。聪明的编译器可以生成常量720打电话fac(6)。相互递归内联函数、根据输入是否递归的内联函数等的可能性,使得不可能保证每次调用inline函数实际上是内联的。编译器的聪明程度无法立法,因此一个编译器可能会生成720, 其他6 * fac(5),还有一个未内联的调用fac(6).

为了在缺乏异常聪明的编译和链接设施的情况下使内联成为可能,内联函数的定义(而不仅仅是声明)必须在范围内(第 9.2 节)。一个inlineespecifier 不影响函数的语义。特别是,内联函数仍然具有唯一的地址,因此static内联函数的变量(第 7.1.2 节)。

EDIT2:ISO-IEC 14882-1998,7.1.2 函数说明符

带有一个函数声明(8.3.5、9.3、11.4)inline说明符声明一个内联函数。内联说明符向实现表明,在调用时函数体的内联替换优先于通常的函数调用机制。不需要实现在调用时执行此内联替换;然而,即使省略此内联替换,仍应遵守 7.1.2 定义的内联函数的其他规则。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候使用内联函数,什么时候不使用它? [复制] 的相关文章

随机推荐