c++ - 运算符链接,为什么要增长左分支?

标签 c++ performance compiler-optimization

根据this question (也就是说,OP陈述了这一信念并且没有得到纠正) - 链式运算符向左增长:

a << b << c << d;
// ==
operator<<( operator<<( operator<<(a, b), c ), d);

为什么会出现这样的情况呢?这样做不是更有效率吗:

operator<<( operator<<(a, b), operator<<(c, d) );

也就是说,尽可能平衡?

编译器肯定可以解决这个问题以获得更好的运行时性能吗?

最佳答案

当您在 C++ 中重载运算符时,它会保留与未重载时运算符相同的优先级和结合性。

对于移位运算符( <<>> ),标准要求:

The shift operators << and >> group left-to-right.

这意味着类似 a<<b<<c 的操作必须解析为 (a<<b)<<c .

重载运算符会更改为每个操作调用的代码,但对分组没有影响 - 无论 a 分组都将相同。 , bc是否属于将使用编译器提供的运算符的内置类型(例如 int ),或者它们是否是将使用重载运算符的某些类类型。无论哪种方式,处理分组的解析器都保持相同。

但请注意,order of evaluation is independent of precedence or associativity ,所以这不一定会影响执行速度。

关于c++ - 运算符链接,为什么要增长左分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28121155/

相关文章:

C++ 跨平台库

Java 原生启动器性能

Java-将大量数据写入csv

c++ - 如何帮助编译器根据输入的约束优化我的程序?

c - 可以为同一个应用程序编译具有不同 gcc 优化级别的文件吗?

c++ - C++ 容器可以包含模板对象吗?出现错误

c++ - 无法访问地址为 0x 的内存

c++ - 有没有更好的方法来实现 2-SUM 算法?

ios - 通过使用带有 ids 的排序 NSArray 来加速 for 循环

c - 我怎样才能让 GCC 用 SSE 指令向量化这个简单的复制循环?