我有一个序列化对象的内存缓冲区,其中包含uint32_t。 uint32_t很容易处于奇数地址。另外,另一个线程可以写入缓冲区;如果可能的话,我可以稍后发现并丢弃我的结果。
我的问题是:如何在x86_64上有效地读取数据(单个movl指令)而不使用未定义的行为?
uint32_t read_int(const volatile void *ptr) {
... what goes here so the generated code is "movl (%rdi), %eax"?
}
读取未对齐数据的传统方法是使用memcpy(),但将易失性指针传递给它是UB。
我可以编写自己的memcpy替换,这是一个逐字节复制的简单循环,但编译器假定我需要按顺序读取每个字节,并且不能将它优化为单个movl
我可以将指针转换为CV uint32_t *,但这是一个未对齐的读取,即UB。
那么,我的选择是什么?