避免函数调用的成本只是故事的一半.
执行以下操作:
inline
而不是#define
inline
个:更快的代码和更小的可执行文件(更多的机会留在代码缓存中)不要:
在开发库时,为了使类将来可以扩展,您应该:
请记住,关键字inline
是对编译器的一个提示:编译器可以决定不内联函数,并且可以决定内联最初没有标记为inline
的函数.我通常避免标记函数inline
(可能在编写非常非常小的函数时分开).
关于性能,明智的方法是(一如既往地)评测应用程序,然后最终生成一组表示瓶颈的函数.
参考资料:
编辑:Bjarne Stroustrup,C++编程语言:
一个函数可以定义为
inline
.例如:
inline int fac(int n)
{
return (n < 2) ? 1 : n * fac(n-1);
}
inline
说明符是对编译器的一个提示,它应该try 为内联调用fac()
生成代码,而不是只放置函数的代码一次,然后通过通常的函数调用机制进行调用.聪明的编译器可以为调用fac(6)
生成常量720
.相互递归的内联函数、依赖于输入的递归或不递归的内联函数等的可能性使得不可能保证inline
函数的每个调用实际上都是内联的.编译器的聪明程度不能被立法,因此一个编译器可能生成720
,另一个生成6 * fac(5)
,而另一个生成未内联调用fac(6)
.为了在没有异常聪明的编译和链接功能的情况下实现内联,内联函数的定义——而不仅仅是声明——必须在范围内(§9.2).
inline
介词不影响函数的语义.特别是,内联函数仍然有一个唯一的地址,因此内联函数有static
个变量(§7.1.2).
编辑2:ISO-IEC 14882-1998,7.1.2功能说明符
带有
inline
说明符的函数声明(8.3.5、9.3、11.4)声明一个内联函数.内联说明符向实现表明,在调用点对函数体进行内联替换比通常的函数调用机制更可取.在调用点执行这种内联替换不需要实现;然而,即使省略了这种内联替换,也应遵守7.1.2中定义的内联函数的其他规则.