编译器优化的示例,可以在C++代码上轻松完成,但不能在C代码上完成

Roh*_*nga 5 c c++ optimization compiler-optimization

这个问题讨论了在C中无法轻易实现的排序函数的优化: qsort vs std :: sort的性能?

是否有更多的编译器优化示例,与C++相比,这些优化在C中是不可能的,或者至少很难实现?

Eva*_*ran 8

正如@sehe在评论中提到的那样.这比抽象更重要.换句话说,如果语言允许编码器更好地表达意图,那么它可以发出以更优化的方式实现该意图的代码.

一个简单的例子是std::fill.当然对于基本类型,你可以使用memset,但是,让我们说它是一个32位unsigned long的数组.std::fill 知道数组大小是32位的倍数.根据编译器的不同,它甚至可以假设数组也在32位边界上正确对齐.

所有这些组合可能允许编译器发出代码,该代码一次设置32位值,没有运行时检查以确保它是有效的.如果幸运的话,编译器将识别这一点,并用特别高效的特定于架构的代码版本替换它.

(实际上gcc和其他主流编译器实际上可以做的几乎任何可以被认为等同于memset已经存在的东西,包括std::fill).

通常,memset以对这些类型的事物进行运行时检查的方式实现,以便选择最佳代码路径.虽然这种差异可能是微不足道的,但我们的想法是我们更好地表达了"填充"具有特定值的数组的意图,因此编译器能够做出稍微更好的选择.

其他更复杂的语言功能可以很好地使用意图表达来获得更大的收益,但这是最简单的例子.

要明确的是,我的观点并不是std::fill"更好" memset,相反,这是c ++如何允许更好地表达编译器意图的示例,允许它在编译期间获得更多信息,从而使一些优化更容易实现.