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

C++ 必须重新编译对内联函数的所有调用吗?,c++,performance,inline,C++,Performance,Inline,我想知道这东西是怎么工作的?我的意思是“对内联函数的所有调用都必须重新编译”。我正在读一本书,书中说每次在我们的程序中使用内联函数时,编译器都会重新编译短函数定义,并将编译后的短函数定义的副本放在代码中 我一点也不明白。如能以实例说明整个过程,将不胜感激。另外,你能解释一下它是如何提高效率的吗 非常感谢 内联函数接受代码并在使用它的任何地方插入一个副本(因此内联)-这节省了函数调用的成本 显然,如果您更改函数,则必须在使用该函数的任何地方更改副本,并且必须从Wikipedia重新编译这些文件(或

我想知道这东西是怎么工作的?我的意思是“对内联函数的所有调用都必须重新编译”。我正在读一本书,书中说每次在我们的程序中使用内联函数时,编译器都会重新编译短函数定义,并将编译后的短函数定义的副本放在代码中

我一点也不明白。如能以实例说明整个过程,将不胜感激。另外,你能解释一下它是如何提高效率的吗


非常感谢

内联函数接受代码并在使用它的任何地方插入一个副本(因此内联)-这节省了函数调用的成本

显然,如果您更改函数,则必须在使用该函数的任何地方更改副本,并且必须从Wikipedia重新编译这些文件(或代码块)

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


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

假设您有以下代码:

void foo() { bar(); }

int main()
{
   foo();
   foo();
   foo();
}
如果
foo
是内联的,那么编译器基本上会将代码重写为:

int main()
{
   bar();
   bar();
   bar();
}
现在,如果不是
bar()您有一段更复杂的代码,那么这段代码将出现(并被编译)三次,而不是一次

您可以将函数调用的成本与增加的重复代码进行权衡


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

谢谢Kerek。知道了。太棒了,太棒了,解释得很简单。谢谢你,马丁。