这些整数没有对齐吗?我应该关心吗

Are these integers misaligned, and should I even care?

本文关键字:我应该 关心 对齐 整数      更新时间:2023-10-16

我有一些代码可以解释任意地址的字节数组中的多字节宽度整数。

std::vector<uint8> m_data; // filled with data
uint32 pos = 13;           // position that might not be aligned well for 8 byte integers
...
uint64 * ptr = reinterpret_cast<uint64*>(m_data.data() + pos);
*ptr = swap64(*ptr);  // (swaps endianness)

对齐是否会成为此代码的问题?如果是,这是一个严重的问题,还是一个可以安全地忽略的问题,因为处罚微不足道?

改用memcpy

uint64_t x;
memcpy(&x, m_data.data()+pos, sizeof(uint64_t));
x = swap(x);
memcpy(m_data.data()+pos, &x, sizeof(uint64_t));

它有两个好处:

  • 您可以避免严格的混叠冲突(将uint8_t缓冲区读取为uint64_t引起(
  • 你根本不必担心错位(你确实需要关心错位,因为即使在x86上,如果编译器自动向量化你的代码,它也可能崩溃(

当前的编译器足够好,可以做正确的事情(即,您的代码不会很慢,memcpy可以识别,并且处理得很好(。

一些体系结构需要对齐读取才能工作。如果对齐不正确,它们会抛出处理器信号。

根据平台的不同,它可以

  1. 程序崩溃
  2. 导致使用未对齐的读取重新运行。(性能命中(
  3. 只需正确工作

执行性能度量是一个良好的开端,检查目标平台的操作系统规范将是谨慎的。