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