为什么我要做这样的事情呢?
有什么区别吗?
inline double square (double x) { return x * x; }
替代
double square (double x) { return x * x; }
有什么区别吗?
inline double square (double x) { return x * x; }
替代
double square (double x) { return x * x; }
前者(使用inline
)允许您将该函数放在头文件中,从而可以在多个源文件中包含它。使用inline
使标识符处于文件范围内,就像声明为static
一样。如果不使用inline
,则链接器会出现多个符号定义错误。
当然,这是另外一种提示编译器将函数编译为内联,直接嵌入到其使用的位置中(避免了调用函数的开销)。编译器不需要根据inline
提示执行操作。
inline
不能防止虚表查找,你需要使用调用去虚拟化来实现。 - Ben Voigt在现代编译器上,可能没有太大区别。即使没有添加 inline
关键字也可能会进行内联,而使用 inline
关键字也不一定能实现内联。
有区别。 https://isocpp.org/wiki/faq/inline-functions.
当你指定函数为内联函数时,你让编译器把方法的代码放到调用它的任何地方。
void myfunc() {
square(2);
}
与...完全相同
void myfunc() {
2 * 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;
}
内联函数,如果编译器允许,将在调用它的代码中包含内联函数,就好像没有调用任何函数一样(就好像您将逻辑放在调用函数中),从而避免了函数调用开销。