编译器如何计算哪个函数应该内联,因为内联请求不是强制性的?我应该用什么样的函数内联?
额外问题。我可以拨打内联电话吗?
void func{} // normal (not-inline) function
int main()
{
func(); // normal call
// inline func(); // inline call
return 0;
}
答案 0 :(得分:5)
当您将函数标记为inline
时,您建议编译器应该内联此函数。在(好的)编译器上,这既不能保证它也不会保证不存在。
函数的所有内联都是用函数体替换对函数的调用。因此,虽然您无法建议编译器应该在哪里内联函数,但您显然可以实际粘贴代码(或使用宏来确保代码保持不变)。但是你需要一个非常好的/奇怪的理由来做到这一点。
通常,如果您愿意,可以将小函数标记为内联,否则将其留给编译器。
答案 1 :(得分:2)
编译器如何计算哪个函数应该内联,因为内联请求不是强制性的?
(来自wiki)在各种版本的C和C ++编程语言中,内联函数是一个函数,已请求编译器执行内联扩展。换句话说,程序员已经请求编译器在调用函数的每个位置插入函数的完整主体,而不是生成代码以在定义它的一个位置调用函数。编译器没有义务尊重此请求。
在C ++中,您可以使用__forceinline
关键字允许程序员强制编译器内联函数,但不加区别地使用__forceinline
会导致代码更大(膨胀的可执行文件),最小或没有性能提升,在某些情况下甚至会导致性能下降。
我应该使用哪种函数进行内联?
小功能。最好在头文件中定义小(如在一个线性中)函数,因为它为编译器提供了更多信息,以便在优化代码时使用。它还会增加编译时间。
查看When should I write the keyword 'inline' for a function/method?了解详情。
我可以拨打内联电话吗?
inline
只能用于函数声明,而不能调用。您只需要将预定义的内联函数作为普通函数调用。答案 2 :(得分:0)
inline
做什么推荐给编译器用这个函数的实际代码替换对这个函数的任何调用,就像T. Kiley刚才说的那样。编译器不有来执行此操作,但如果确实如此,则会发生以下情况:
如果你有这个功能:
inline int addtwo(int i)
{
return i+2;
}
编译器将替换所有语句,如
cout<<addtwo(x)<<endl;
与
cout<<(x+2)<<endl;
如果您的函数长于几行,则完成的可执行文件大小将增加,因为每个调用都将替换为函数的整个代码。 (还有哪些其他缺点?)
inline
适用于简单(1行)的函数。