c ++内联函数?

时间:2011-05-11 23:32:53

标签: c++

我为什么要这样做:

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

而不是

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

有区别吗?

6 个答案:

答案 0 :(得分:81)

前者(使用inline)允许您将该函数放在头文件中,它可以包含在多个源文件中。使用inline文件范围中生成标识符,就像声明它static一样。如果不使用inline,您将从链接器中获得多个符号定义错误。

当然,除了对编译器的提示之外,还应该将函数 inline 编译到使用它的位置(避免函数调用开销)。编译器不需要对inline提示采取行动。

答案 1 :(得分:27)

是的,有区别。 https://isocpp.org/wiki/faq/inline-functions

当您指定函数是内联时,您正在使编译器将方法的代码放在调用它的位置。

void myfunc() {
  square(2);
}

相同
void myfunc() {
   2 * 2;
}

调用函数有利于代码清晰度,但是当调用该函数时必须将本地状态推送到堆栈,为该方法设置一个新的本地状态,并且当它完成时,之前的状态需要是弹出。这是很多开销。

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

答案 2 :(得分:21)

在现代编译器上,可能没有太大区别。它可以在没有inline的情况下内联,并且可能 {/ 1}}。

答案 3 :(得分:5)

来自维基百科:内联函数是一个函数,已要求编译器执行内联扩展。换句话说,程序员已经请求编译器在调用函数的每个位置插入函数的完整主体,而不是生成代码以在定义它的一个位置调用函数。编译器没有义务尊重此请求。

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

答案 4 :(得分:2)

如果编译器符合要求,内联函数将在调用它的代码中包含内联函数,就像没有调用函数一样(就好像你已经将逻辑放在调用函数中)并避免函数调用开销

答案 5 :(得分:2)

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; 
}

这是因为当编译器内联扩展函数调用时,函数的代码会被插入到调用者的代码流中;因此,将第二个例子在程序上抽象到第一个例子可能更容易。

程序抽象使得可以将例程分解为更容易阅读的更小的子例程(尽管这可以是样式选择)。