内联函数实际上做了什么?

时间:2015-01-11 19:24:06

标签: c++ c

我在互联网上搜索了一些与内联函数相关的主题,但没有一个让我怀疑。

到目前为止,我知道内联函数的工作方式与方法或块相同,但最近看到了以下响应:

  

通过声明函数内联,告诉编译器替换   该函数的完整代码直接进入它所在的地方   被称为。这是一个需要相当高级的功能   对低级程序设计的理解。

所以这意味着在正常的功能中:我在A点并且想要去B点,因为我离开A然后去B,对吧?

内联函数是否以这种方式工作:我在A点,并希望转到B点,B点到达A点?

我上面说的是对的吗?

3 个答案:

答案 0 :(得分:1)

引用应该是"替换呼叫" ......"放置完整的代码"。内联函数背后的理想类似于宏;在源代码中调用内联函数的每个位置,而不是调用内联函数,调用将替换为内联函数中的完整代码,并且不进行调用。这可能会生成大量重复的代码,但应该导致更快的执行,除非代码大小的增加导致缓存问题。在某些情况下,编译器可能会忽略内联选项并使用正常调用。

答案 1 :(得分:1)

理想情况下,使用inline关键字,编译器会在调用函数的位置粘贴内联函数的内容。

假设:

void Print(void)
{
  cout << "Hello World!\n";
}

int main(void)
{
  Print();
  return 0;
}

编译器会发出汇编指令来调用Print函数内的main函数。

当将Print函数声明为内联时,编译器将在下面生成概念main()函数:

int main(void)
{
  // Substitute content of Print function because it's declared as inline
  cout << "Hello World!\n";

  return 0;
}

请记住,inline关键字是对编译器的建议,编译器可以忽略它。编译器可能已经内联小函数而不使用inline关键字。

很久以前,inline关键字用于强制编译器粘贴调用函数的代码。该技术用于消除函数调用开销。这是编译器对优化不太聪明的时代。

答案 2 :(得分:0)

当你想节省运行时间时,内联函数是一个很好的工具,因为当你调用这种函数(内联)时,它的代码会被写入调用的位置。为什么节省时间?因为调用常规函数只需要花费更多时间而不仅仅是粘贴其功能。例如:

inline void sayHi()
{ 
    std::cout<<"Hi!";
}
int main()
{
    sayHi();         //Calling an inline function 
    std::cin.get();
}

编译器粘贴std :: cout&lt;&lt;“嗨!”;而不是sayHi(); 所以你所说的实际上是正确的。