[英]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:内联函数是已要求编译器执行内联扩展的函数。 换句话说,程序员已要求编译器在调用函数的每个位置插入函数的完整主体,而不是生成代码以在定义的那个位置调用该函数。 编译器没有义务遵守此请求。
如果编译器遵从,则内联函数将在被调用的代码中包括内联函数,就好像没有调用任何函数一样(就像您已将逻辑放在调用函数中一样),并避免了函数调用开销。
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.