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

标签 c++ c performance optimization header-files

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

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

最佳答案

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

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

许多现代编译器可以进行链接时优化,可以在链接阶段内联开始时未内联的代码,但会增加链接时间。延迟到链接时也可能会丢失某些优化机会。

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

关于c++ - 现代 C/C++ 编译器能否更好地优化 header 中的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28028430/

相关文章:

字典的 Python 列表理解示例

介于或大于 > 条件下的 MySQL 查询优化

c++ - 如何计算二值图像上的白色物体?

c++ - 无法从函数返回动态字符串

c++ - C++ 标准库是否有用于 printf 转换说明符的模板化 getter?

c - 数组比较中的意外行为

c - 如何使用 epoll 管理从多个客户端接收多个缓冲区?

C++ 模板函数。错误 C2440 : 'return' : cannot convert from '_FwdIt1' to '_FwdIt1'

c - 如何在不使用 WinMain 的情况下编写 Windows 应用程序?

python - 在运行 Python 2.7 的 Google App Engine 中获取 Thread.Lock 需要 50% 的响应时间