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

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

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

inline 关键字可以帮助编译器确定应该内联哪些函数,但除此之外,还有理由在 header 中使用短的性能关键函数吗?还是对于现代编译器不再重要?

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

但是编译器可以而且确实利用了能够看到被调用函数的代码的优势。这种情况不仅发生在内联函数中,也发生在代码可能可见的任何其他函数中。许多编译器试图很好地猜测是否内联代码。内联代码可能会使程序变大或变小、变快或变慢。如果编译器可以确定内联代码时代码可能会更快、更小,那么它就会这样做。否则就得考虑权衡了。

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

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