现代 C/C++ 编译器能否更好地优化标头中的代码

Can a modern C/C++ compiler optimize better with the code in header?

本文关键字:优化 代码 更好 C++ 编译器 现代      更新时间:2023-10-16

我经常听说将代码放在标头中是一种不好的做法,但是在标头中放置短函数是很常见的,部分原因是为了帮助编译器更好地优化。

内联

关键字可以帮助编译器确定应该内联哪些函数,但除此之外,是否仍然有理由在标头中包含短性能关键函数?或者对于现代编译器来说,这不再重要了?

从技术上讲,inline 关键字仅表示允许在多个翻译单元中使用定义。也就是说,如果您在头文件中定义了内联函数,并且该头包含在多个源文件中,那么这很好。 对于非内联、非模板函数,这将是非法的。

但是编译器可以并且确实利用了能够看到正在调用的函数的代码。这不仅发生在内联函数上,还发生在代码可能可见的任何其他函数上。许多编译器试图对是否内联代码做出很好的猜测。内联代码可能会使程序变大或变小,更快或更慢。 如果编译器可以确定代码在内联时代码可能更快且更小,那么它将执行此操作。否则,它必须考虑权衡。

许多现代编译器可以执行链接时优化,其中一开始未内联的代码可以在链接阶段内联,但链接时间会有一些成本。当延迟到链接时间时,可能会丢失某些优化机会。

根据我自己的经验,我发现使小函数内联通常总是在大小和速度方面都是一种胜利。对于较大的函数,我经常看到它使程序更快但更大,但我也很少看到它使程序更慢和更大。如果特定功能的性能很重要,则需要进行测量以帮助选择是否内联。