c++ - 可以在 C++ 代码而非 C 代码上完成 'easily' 的编译器优化示例

标签 c++ c optimization compiler-optimization

这个问题讨论了在 C 中不容易实现的排序函数的优化: Performance of qsort vs std::sort?

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

最佳答案

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

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

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

(实际上 gcc 和可能其他主流编译器实际上对任何可以被认为等同于 memset 的东西都这样做,包括 std::fill).

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

其他更复杂的语言特征在使用意图表达方面做得很好,可以获得更大的 yield ,但这是最简单的例子。

需要明确的是,我的观点并不是说 std::fillmemset“更好”,相反,这是一个 C++ 如何允许 更好的例子向编译器表达意图,使其在编译期间拥有更多信息,从而使一些优化更容易实现。

关于c++ - 可以在 C++ 代码而非 C 代码上完成 'easily' 的编译器优化示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10080025/

相关文章:

c++ - 在 C++ 中对矩阵缓存友好的 C++ 操作?

javascript - 为什么这段 JavaScript 代码经过 Node.js 优化后运行速度变慢了

C++ 意外的多线程行为

c++ - 避免或改进暴力破解方法 : Counting character repetition from all words in a dictionary text file

c - 在哪里可以找到 radix-5 FFT 实现?

c - 将 R.h Rembedded.h 与 C 代码链接

python - 如何优化西类牙语翻译程序的代码?

c++ - 在不使用字符串的情况下计算数字中的数字

c++ - 在堆栈/堆上创建对象?

c - 为什么包括头文件而不是实现?