我知道内联是对编译器的提示或请求,用于避免函数调用开销。
那么,根据什么可以确定一个函数是否适合内联呢?
在什么情况下应该避免内联?
避免函数调用的成本只是故事的一半。
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 节)。一个inline
especifier 不影响函数的语义。特别是,内联函数仍然具有唯一的地址,因此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(使用前将#替换为@)