如果更改通过引用传递的变量,是否有任何原因导致现代C++编译器无法优化冗余 mov 指令?
慢:https://gcc.godbolt.org/z/2Bmidk
冗余mov:
10: mov QWORD PTR [rdi], rdx
快速:https://gcc.godbolt.org/z/u3GMLx
为什么编译器只是不将 begin_ 变量存储在CPU寄存器中,然后在函数末尾将其写入内存?
最佳答案
看来这可能是无效的优化。如果begin_
等于this
即CharStream
本身的地址(并且使用char*
读取任何对象的字节有效)怎么办?在这种情况下,首次读取后CharStream
将更改,所以range [begin;结束)
为避免这种情况,您可以执行以下任一操作:
char*
一致):https://gcc.godbolt.org/z/QfOUwW(请注意行为上的变化。如果需要修改,则需要返回流)char
,以便它不能与CharStream
别名:https://gcc.godbolt.org/z/2_gREf(请注意,使用Byte*
而不是char*
读取数据可能是未定义的,因为它最初是some_other_type*
)