哪里可以找到跨不同平台/编译器的C++内存对齐文档?

And*_*hko 9 c++ memory-alignment

我正在寻找一个关于C++内存对齐的好(全面)文档,典型方法,编译器之间的差异以及常见的陷阱.只是为了检查我对这个主题的理解是否正确并学习新的东西.

这个问题的灵感来自于我使用以下构造的另一个问题的答案:

char const buf[1000] = ...;
unsigned int i = *reinterpret_cast<unsigned int*>(buf + shift); // shift can be anything
Run Code Online (Sandbox Code Playgroud)

它被批评为不符合内存对齐规则.你可以解释为什么这种方法从内存对齐的角度来看是有缺陷的?一个不起作用的例子将受到高度赞赏.我知道这通常是一种糟糕的方法,但我经常在网络协议实现中使用它,所以它比理论问题更实际.

另外请不要在这里提到严格别名,这是另一个问题.

Mar*_*k B 6

非堆分配的数组char对其对齐没有特定要求.所以你的1000个字符的缓冲区可能是奇数偏移量.int如果编译器没有将其拆分为单独的读取+位掩码操作,那么尝试从该偏移量读取(重新解释为明显的int指针)会导致性能不佳甚至某些硬件上的总线错误.

char保证堆分配的数组适当地对齐以存储任何对象类型,因此这始终是一个选项.

对于非堆基存储,使用boost::aligned_storage它可确保空间正确对齐以供一般使用.


小智 3

您可以在维基百科上找到概述。IBM 网站上有更深入的内容:数据对齐:拉直并向右飞行