如果通过引用传递变量,则可以执行多余的mov操作

时间:2019-01-01 20:17:53

标签: c++ gcc assembly optimization compiler-optimization

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

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

冗余mov:

10:        mov     QWORD PTR [rdi], rdx

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

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

1 个答案:

答案 0 :(得分:2)

这似乎是无效的优化。如果begin_等于this,即CharStream本身的地址(并且使用char*读取任何对象的字节是有效的)怎么办?在这种情况下,CharStream会在第一次读取后发生变化,因此范围[begin;结束)

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

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