我有一些代码可以从任意地址的字节数组中解释多字节宽度的整数。
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
被识别,并且会被很好地处理)。
关于c++ - 这些整数是否未对齐,我应该关心吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51588059/