现代 C/C++ 编译器能否更好地优化标头中的代码
Can a modern C/C++ compiler optimize better with the code in header?
我经常听说将代码放在标头中是一种不好的做法,但是在标头中放置短函数是很常见的,部分原因是为了帮助编译器更好地优化。
内联关键字可以帮助编译器确定应该内联哪些函数,但除此之外,是否仍然有理由在标头中包含短性能关键函数?或者对于现代编译器来说,这不再重要了?
从技术上讲,inline
关键字仅表示允许在多个翻译单元中使用定义。也就是说,如果您在头文件中定义了内联函数,并且该头包含在多个源文件中,那么这很好。 对于非内联、非模板函数,这将是非法的。
但是编译器可以并且确实利用了能够看到正在调用的函数的代码。这不仅发生在内联函数上,还发生在代码可能可见的任何其他函数上。许多编译器试图对是否内联代码做出很好的猜测。内联代码可能会使程序变大或变小,更快或更慢。 如果编译器可以确定代码在内联时代码可能更快且更小,那么它将执行此操作。否则,它必须考虑权衡。
许多现代编译器可以执行链接时优化,其中一开始未内联的代码可以在链接阶段内联,但链接时间会有一些成本。当延迟到链接时间时,可能会丢失某些优化机会。
根据我自己的经验,我发现使小函数内联通常总是在大小和速度方面都是一种胜利。对于较大的函数,我经常看到它使程序更快但更大,但我也很少看到它使程序更慢和更大。如果特定功能的性能很重要,则需要进行测量以帮助选择是否内联。
相关文章:
- 如何优化代码以返回最接近给定整数的数字,但给定列表中不存在?
- 需要消除这些"else if"并优化代码
- C/C++编译器是否会通过重用最近计算的函数结果来优化代码?
- 如何优化C 代码的以下片段 - 卷中的零交叉点
- C++按字符串调用函数,比较PHP的性能,如何在C++中优化代码
- 优化c++代码以添加两个作为字符串的数字
- x86 汇编和优化代码中的 for 循环
- 如何在gcc中设置模板功能的自动优化代码
- 优化代码/实现"for"循环而不是长"if - else if - else"
- 我的粒子群优化代码在 C++ 和 MATLAB 中生成不同的答案
- 优化代码以获取给定范围内可被整数整除的整数数
- if条件下两个字符串比较的优化代码
- Cuda Thrust - 如何使用sort_by_key、merge_by_key和reduce_by_key优化代码
- 如何优化代码中的参数
- 针对大量迭代优化代码
- 编译器在程序集中优化代码时会做什么?即O2标志
- 优化代码(康威的生命游戏)
- 用于 TSP 的 3 选项优化代码
- 如何使用 SSE 或 GLSL 优化"u[0]*v[0] + u[2]*v[2]"代码行
- 是否有任何情况将对象标记为 const 会导致更好的优化代码(使用优化编译时)