必须重新编译对内联函数的所有调用?

时间:2012-01-05 04:46:54

标签: c++ performance inline

我需要知道这件事有什么作用?我的意思是“所有对内联函数的调用都必须重新编译”。我正在读一本书,上面说每次在我们的程序中使用内联函数时,编译器将重新编译短函数定义并在代码中放置这个编译的短定义的副本。

我根本不明白这一点。将以高度赞赏的方式展示整个过程的示例。另外,请您解释一下如何提高效率。

非常感谢。

3 个答案:

答案 0 :(得分:3)

内联函数接受代码并在任何地方插入副本(因此内联) - 这样可以节省函数调用的成本。

如果你更改了这个功能,那么必须在任何地方更改副本 - 并且必须重新编译每个文件(或代码块)

答案 1 :(得分:3)

假设您有以下代码:

void foo() { bar(); }

int main()
{
   foo();
   foo();
   foo();
}

如果内联foo,则编译器将基本上将代码重写为:

int main()
{
   bar();
   bar();
   bar();
}

现在,如果代替bar();你有一段更复杂的代码,那么这段代码就会出现(并被编译)三次,而不是一次。

您将函数调用的代价与增加的和重复的代码进行交换。

编译器可能会拒绝实际内联函数。如果您使用foo的地址并将其传递到外面的某个地方,您甚至无法绕过创建独立版本。在实践中,根据最适合的情况,会发生独立和内联的快乐组合。 (但最终生成的代码更重要的是inline关键字对单一定义规则的影响。)

答案 2 :(得分:2)

来自维基百科

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

这意味着编译器会将内联函数调用扩展为函数定义。换句话说,在调用的每个地方都会替换函数的完整主体。 而对于普通函数,函数定义保存在一个地方,并且编译器生成代码以在代码中调用函数时调用函数。

另请注意,将函数指定为内联只是一个请求,编译器也应忽略此请求。