c++ - 这些整数是否未对齐,我应该关心吗?

标签 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)

对齐会成为这段代码的问题吗?如果是,这是一个严重的问题,还是可以放心忽略的问题,因为惩罚微不足道?

最佳答案

改用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/

相关文章:

c++ - 从 Qt 应用程序运行命令行点程序不会产生任何输出,这是怎么回事?

c - 为什么 short 是 2 字节对齐的?

html - 水平对齐选择框

c# - 数组访问是否比模除法更快?

html - 表格单元格中的中心文本

c++ - 在 wxwidgets 中创建 wxSashLayoutWindow 时出现链接错误

c++ - vector 循环的起始值

c++ - 我不明白什么是返回

sql - CROSS APPLY vs OUTER APPLY速度差

ios - 如何使用多个 subview 保持 iOS 动画流畅