如果我声明了一个内联大函数,并且编译器仍然选择将其编译为独立函数,则可以保证程序中该非内联内联函数只有一个副本,否则编译器最终可能会创建多个非内联函数函数在不同翻译单元中的内联副本?

或者,以某种几乎可以肯定的方式重新表述一下:不用担心预处理时间,在不需要担心预处理时间的情况下,可以在头文件中内联定义大方法,这是一种能够有效地重复使用该代码而不必在单独的翻译单元中进行编译/链接?

最佳答案

您在这里需要特别明确,因为您需要保证。 C++标准保证程序性能,而不保证实现,即使这样,也不能防止恶意编译器。许多实现细节受到行为的有效约束。但并不完全。

编译器可以自由地在您的可执行文件中嵌入2 ^ 17个任何内联函数或不内联函数的不同副本。这将毫无意义,但是标准并没有禁止它!静态变量的值和地址必须共享,这是可以观察到的,并且如果C++代码可以到达它们,则指向每个函数的所有函数指针都必须比较相等(它们可以具有地址的不同二进制表示形式,更改执行==的含义!)。

这会发生吗?不,但是您要求担保。 C++标准为实现者留出了很大的自由度。实现的质量意味着现代的编译器不会经常做愚蠢的事情。

实际上,在每个使用内联函数的.o文件中都会创建一个内联函数。它被标记为特殊(“弱”)。静态链接时,所有这些副本中的一个副本都将被丢弃。保留哪一个取决于链接顺序,并且可能因构建而异(尤其是部分构建)。以静态方式仅保留静态本地副本的一个副本。在运行时,所有指向函数或静态本地的指针必须比较相等。

动态链接会导致某些编译器在将其内置到dll中时将其丢弃。加载.so时,其他编译器会查看符号是否已加载,如果不加载,则不要在.so中加载副本。在动态链接的情况下,该功能的多个副本很可能继续存在并被访问。很明显,如果没有这种情况,请进行测试。 C++标准未描述动态链接。

关于c++ - 是否可以保证非内联内联函数只有一个拷贝?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40040371/

10-17 00:20