c + +内联函数?
为什么我应该这样做:
inline double square (double x) { return x*x;}
代替
double square (double x) { return x*x;}
有区别吗?
前者(使用inline
)允许你把这个函数放在一个头文件中,它可以包含在多个源文件中。 使用inline
使文件范围 inline
的标识符,就像声明它是static
。 不使用inline
,你会从链接器得到一个多符号定义错误。
当然,除了向编译器提示函数应该内联编译到使用位置(避免函数调用开销)外。 编译器不需要根据inline
提示进行操作。
是,有一点不同。 https://isocpp.org/wiki/faq/inline-functions 。
当你指定一个函数是内联的时候,你正在让编译器把方法的代码放在它被调用的地方。
void myfunc() { square(2); }
是相同的
void myfunc() { 2 * 2; }
调用一个函数对于代码清晰是有好处的,但是当这个函数被调用的时候,本地状态必须被压入堆栈,为这个方法设置一个新的本地状态,当这个状态完成时,需要popup以前的状态。 这是很多开销。
现在,如果你达到你的优化级别,编译器将做出如展开循环或内联函数的决定。 编译器仍然可以自由地忽略内联语句。
在现代编译器中,可能没有太大的区别。 它可以内联而不用inline
,也可以不内联内inline
。
内联函数是编译器被请求执行内联扩展的函数。 换句话说,程序员已经要求编译器在函数被调用的每个地方插入函数的完整主体,而不是生成代码来调用定义在一个地方的函数。 编译器没有义务尊重这个请求。
如果编译器符合,内联函数将在代码中包含内联函数,就像没有函数被调用一样(就好像你把逻辑放在调用函数中一样)并且避免了函数调用的开销。
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; }
发生这种情况是因为当编译器内联展开函数调用时,函数的代码被插入到调用者的代码stream中; 因此,将第二个例子程序化地抽象成第一个例子可能会更容易。
程序抽象使得将例程分解成更易于阅读的更小的子程序成为可能(尽pipe这可以是风格select)。