这些整数未对齐吗,我什至应该关心吗?

时间:2018-07-30 06:22:41

标签: c++ performance alignment

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

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)

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

2 个答案:

答案 0 :(得分:2)

改为使用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 :(得分:1)

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

取决于平台,

  1. 使程序崩溃
  2. 导致读取未对齐的情况下重新运行。 (效果不错)
  3. 只要工作正常

执行性能衡量是一个好的开始,并且谨慎检查目标平台的OS规格。