我有一些代码可以从任意地址的字节数组中解释多字节宽度的整数。
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)
对齐是否会成为此代码的问题?如果是的话,这是一个严重的问题,还是因为罚款微不足道而可以忽略的问题?
答案 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
而引起)当前的编译器足以执行正确的操作(即,您的代码不会变慢,memcpy
被识别并且可以被很好地处理)。
答案 1 :(得分:1)
某些体系结构要求读取必须对齐才能工作。如果对齐不正确,它们会抛出处理器信号。
取决于平台,
执行性能衡量是一个好的开始,并且谨慎检查目标平台的OS规格。