c ++内联函数?

Pwn*_*nna 68 c++ inline

我为什么要这样做:

inline double square (double x) { return x*x;}
Run Code Online (Sandbox Code Playgroud)

代替

double square (double x) { return x*x;}
Run Code Online (Sandbox Code Playgroud)

有区别吗?

Gre*_*ill 82

前者(使用inline)允许您将该函数放在头文件中,它可以包含在多个源文件中.使用inline文件范围内创建标识符,就像声明标识符一样static.如果不使用inline,您将从链接器中获得多个符号定义错误.

当然,除了对编译器的提示之外,还应该将函数内联编译到使用它的位置(避免函数调用开销).编译器不需要根据inline提示进行操作.

  • @Greg:它实际上并不像是"静态".如果确实如此,每个翻译单元都拥有自己对该函数副本的所有权,并且链接器会将它们全部视为不同的函数(碰巧具有相同的名称).相反,`inline`指示链接器,如果它看到此函数的不同定义,它们都是相同的,必须合并为一个.但忽略了这个细节,它在很大程度上表现得好像是"静态的". (8认同)
  • 我认为内联的目的是让编译器在调用它的地方“扩展”函数的内容,因此不会有 vtable 查找(或指令跳转到 CPU 级别的函数)。 (2认同)

Eri*_*dek 26

是,有一点不同.https://isocpp.org/wiki/faq/inline-functions.

当您指定函数是内联时,您正在使编译器将方法的代码放在调用它的位置.

void myfunc() {
  square(2);
}
Run Code Online (Sandbox Code Playgroud)

是完全相同的

void myfunc() {
   2 * 2;
}
Run Code Online (Sandbox Code Playgroud)

调用函数有利于代码清晰度,但是当调用该函数时,必须将本地状态推送到堆栈,为该方法设置新的本地状态,并且当完成时,需要弹出先前的状态.这是很多开销.

现在,如果您提高了优化级别,编译器将做出诸如展开循环或内联函数之类的决策.编译器仍然可以忽略内联语句.

  • 我认为使用gcc你可以使用编译标志`-Winline`来警告函数不会被内联.如果你是一个狂热分子,你可以将它与`-Werror'结合起来. (2认同)

Ben*_*son 23

在现代编译器上,可能没有太大区别.它可以不被内联inline,它可能不会被内联inline.


joh*_*yan 5

来自Wikipedia:内联函数是一个函数,已请求编译器执行内联扩展.换句话说,程序员已经请求编译器在调用函数的每个位置插入函数的完整主体,而不是生成代码以在定义它的一个位置调用函数.编译器没有义务尊重此请求.

http://en.wikipedia.org/wiki/Inline_function