我为什么要这样做:
inline double square (double x) { return x*x;}
而不是
double square (double x) { return x*x;}
有区别吗?
答案 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)
来自维基百科:内联函数是一个函数,已要求编译器执行内联扩展。换句话说,程序员已经请求编译器在调用函数的每个位置插入函数的完整主体,而不是生成代码以在定义它的一个位置调用函数。编译器没有义务尊重此请求。
答案 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;
}
这是因为当编译器内联扩展函数调用时,函数的代码会被插入到调用者的代码流中;因此,将第二个例子在程序上抽象到第一个例子可能更容易。
程序抽象使得可以将例程分解为更容易阅读的更小的子例程(尽管这可以是样式选择)。