内联的标准是什么

时间:2014-01-16 20:13:27

标签: c++ inline

编译器如何计算哪个函数应该内联,因为内联请求不是强制性的?我应该用什么样的函数内联?

额外问题。我可以拨打内联电话吗?

void func{} // normal (not-inline) function

int main()
{
  func();           // normal call
  // inline func(); // inline call
  return 0;
}

3 个答案:

答案 0 :(得分:5)

当您将函数标记为inline时,您建议编译器应该内联此函数。在(好的)编译器上,这既不能保证它也不会保证不存在。

函数的所有内联都是用函数体替换对函数的调用。因此,虽然您无法建议编译器应该在哪里内联函数,但您显然可以实际粘贴代码(或使用宏来确保代码保持不变)。但是你需要一个非常好的/奇怪的理由来做到这一点。

通常,如果您愿意,可以将小函数标记为内联,否则将其留给编译器。

答案 1 :(得分:2)

  

编译器如何计算哪个函数应该内联,因为内联请求不是强制性的?

  • (来自wiki)在各种版本的C和C ++编程语言中,内联函数是一个函数,已请求编译器执行内联扩展。换句话说,程序员已经请求编译器在调用函数的每个位置插入函数的完整主体,而不是生成代码以在定义它的一个位置调用函数。编译器没有义务尊重此请求。

    在C ++中,您可以使用__forceinline关键字允许程序员强制编译器内联函数,但不加区别地使用__forceinline会导致代码更大(膨胀的可执行文件),最小或没有性能提升,在某些情况下甚至会导致性能下降。

  

我应该使用哪种函数进行内联?

  

我可以拨打内联电话吗?

  • 您无法进行内联调用,inline只能用于函数声明,而不能调用。您只需要将预定义的内联函数作为普通函数调用。

答案 2 :(得分:0)

inline做什么推荐给编译器用这个函数的实际代码替换对这个函数的任何调用,就像T. Kiley刚才说的那样。编译器不来执行此操作,但如果确实如此,则会发生以下情况:

如果你有这个功能:

inline int addtwo(int i)
{
return i+2;
}

编译器将替换所有语句,如

cout<<addtwo(x)<<endl;

cout<<(x+2)<<endl;

如果您的函数长于几行,则完成的可执行文件大小将增加,因为每个调用都将替换为函数的整个代码。 (还有哪些其他缺点?)

inline适用于简单(1行)的函数。