我经常听说将代码放在 header 中是不好的做法,但将短函数放在 header 中很常见,部分原因是为了帮助编译器更好地优化。
inline 关键字可以帮助编译器确定应该内联哪些函数,但除此之外,是否还有理由在 header 中包含简短的性能关键函数?还是对于现代编译器来说不再重要了?
最佳答案
从技术上讲,inline
关键字仅表示允许在多个翻译单元中定义。也就是说,如果您在头文件中定义了一个内联函数,并且该头文件包含在多个源文件中,那就没问题了。对于非内联、非模板函数,这是非法的。
但是编译器可以并且确实利用能够看到被调用函数的代码的优势。这种情况不仅发生在内联函数中,也发生在代码可能可见的任何其他函数中。许多编译器试图很好地猜测是否内联代码。内联代码可能会使程序变大或变小、变快或变慢。如果编译器可以确定内联代码时代码可能会更快、更小,那么它就会这样做。否则它必须考虑权衡。
许多现代编译器可以进行链接时优化,可以在链接阶段内联开始时未内联的代码,但会增加链接时间。延迟到链接时也可能会丢失某些优化机会。
根据我自己的经验,我发现将小函数内联通常总是在大小和速度上双赢。对于较大的函数,我经常看到它使程序更快但更大,但我也很少看到它使程序变慢和更大。如果特定函数的性能很重要,您将需要进行测量以帮助选择是否内联。
关于c++ - 现代 C/C++ 编译器能否更好地优化 header 中的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28028430/