我为什么要做这样的事情:
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
关键字导致该函数在所有调用站点上都内联,依此类推。那可能不是最接近的骗子。
Answers:
前者(使用inline
)使您可以将该函数放在头文件中,该文件可以包含在多个源文件中。使用inline
使标识符成为文件范围,就像声明它一样static
。如果不使用inline
,则会从链接器中收到多个符号定义错误。
当然,这是对编译器的提示,它暗示应该将函数内联编译到使用该函数的位置(避免了函数调用的开销)。不需要编译器对inline
提示进行操作。
static
。如果这样做的话,每个翻译单元将对其函数副本拥有自己的所有权,并且链接程序会将它们全部视为不同的函数(碰巧具有相同的名称)。相反,inline
指示链接器,如果看到此功能的不同定义,则它们都是相同的,必须合并为一个。但是,忽略该细节,它在大多数情况下的行为就像是static
。
inline
无法阻止vtable查找,您需要为此进行调用虚拟化。
是,有一点不同。https://isocpp.org/wiki/faq/inline-functions。
当指定函数为内联函数时,将导致编译器将方法的代码放在被调用的位置。
void myfunc() {
square(2);
}
等同于
void myfunc() {
2 * 2;
}
调用一个函数有助于代码清晰,但是当调用该函数时,必须将本地状态推送到堆栈中,为此方法设置一个新的本地状态,完成后,需要弹出先前的状态。那是很多开销。
现在,如果您提高了优化级别,则编译器将做出诸如展开循环或内联函数之类的决策。编译器仍然可以忽略内联语句。
-Winline
来警告何时不内联函数。-Werror
如果您是按摩师,可以将其与。
来自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;
}
发生这种情况的原因是,当编译器内联扩展函数调用时,该函数的代码将插入到调用者的代码流中。因此,从程序上将第二个示例抽象为第一个示例可能会更容易。
过程抽象使将例程分解为更易于阅读的较小子例程成为可能(尽管这可以作为样式选择)。