如何有效地访问未对齐的易失性存储器?

时间:2016-08-22 15:15:32

标签: c++ memory-alignment

我有一个序列化对象的内存缓冲区,其中包含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。

那么,我的选择是什么?

0 个答案:

没有答案