首页 > 解决方案 > 如果您通过引用传递变量,则冗余 mov 操作

问题描述

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

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

冗余移动:

10:        mov     QWORD PTR [rdi], rdx

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

为什么编译器不将begin_变量存储在 CPU 寄存器中并在函数结束时将其写入内存?

标签: c++gccassemblyoptimizationcompiler-optimization

解决方案


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

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

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

推荐阅读