如果更改通过引用传递的变量,是否有任何原因导致现代C++编译器无法优化冗余 mov 指令?

慢:https://gcc.godbolt.org/z/2Bmidk

冗余mov:

10:        mov     QWORD PTR [rdi], rdx

快速:https://gcc.godbolt.org/z/u3GMLx

为什么编译器只是不将 begin_ 变量存储在CPU寄存器中,然后在函数末尾将其写入内存?

最佳答案

看来这可能是无效的优化。如果begin_等于thisCharStream本身的地址(并且使用char*读取任何对象的字节有效)怎么办?在这种情况下,首次读取后CharStream将更改,所以range [begin;结束)

为避免这种情况,您可以执行以下任一操作:

  • 按值接受CharStream(这样它的地址是唯一的,并且不与任何char*一致):https://gcc.godbolt.org/z/QfOUwW(请注意行为上的变化。如果需要修改,则需要返回流)
  • 使用另一种类型而不是char,以便它不能与CharStream别名:https://gcc.godbolt.org/z/2_gREf(请注意,使用Byte*而不是char*读取数据可能是未定义的,因为它最初是some_other_type*)
  • 07-27 20:05