繁体   English   中英

C ++内联函数?

[英]c++ inline function?

我为什么要做这样的事情:

inline double square (double x) { return x*x;}

代替

double square (double x) { return x*x;}

有区别吗?

前者(使用inline )使您可以将该函数放在头文件中,该文件可以包含在多个源文件中。 使用inline使标识符在文件范围内 ,就像声明它为static 如果不使用inline ,则会从链接器中收到多个符号定义错误。

当然,这是对编译器的提示的补充,即应将函数内联编译到使用该函数的位置(避免了函数调用的开销)。 不需要编译器inline提示进行操作。

是,有一点不同。 https://isocpp.org/wiki/faq/inline-functions

当指定函数为内联函数时,将导致编译器将方法的代码放在被调用的位置。

void myfunc() {
  square(2);
}

与...相同

void myfunc() {
   2 * 2;
}

调用一个函数有助于代码清晰,但是当调用该函数时,必须将本地状态推送到堆栈中,为此方法设置一个新的本地状态,完成后,需要弹出先前的状态。 那是很多开销。

现在,如果您提高了优化级别,则编译器将做出诸如展开循环或内联函数之类的决策。 编译器仍然可以忽略内联语句。

在现代编译器上,可能没有太大区别。 它可以不被内联inline ,它可能无法 内联inline

摘自Wikipedia:内联函数是已要求编译器执行内联扩展的函数。 换句话说,程序员已要求编译器在调用函数的每个位置插入函数的完整主体,而不是生成代码以在定义的那个位置调用该函数。 编译器没有义务遵守此请求。

http://en.wikipedia.org/wiki/Inline_function

如果编译器遵从,则内联函数将在被调用的代码中包括内联函数,就好像没有调用任何函数一样(就像您已将逻辑放在调用函数中一样),并避免了函数调用开销。

inline可以很好地与过程抽象的概念配合使用:

inline double square (double x) { return x*x;}

int squareTwice(double x) {
    double first = square(x);
    double second = square(x);
    return first * second; 
}

上面的内容基本上与以下内容相似:

int squareTwice(double x) {
    double first = x*x;
    double second = x*x;
    return first * second; 
}

发生这种情况的原因是,当编译器内联扩展函数调用时,该函数的代码将插入到调用者的代码流中。 因此,从程序上将第二个示例抽象为第一个示例可能会更容易。

程序抽象使将例程分解为更易于阅读的较小子例程成为可能(尽管这可以作为一种样式选择)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM