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

Where can I find documentation on C++ memory alignment across different platforms/compilers?

本文关键字:c++ 编译器 内存 对齐 文档 平台 于跨不 在哪里      更新时间:2023-10-16

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

这个问题的灵感来自于我对另一个问题的回答,我使用了以下结构:

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

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

也请不要在这里提到严格混叠,这是另一个问题。

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

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

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

您可以在wikipedia上找到概述。在IBM站点上有更深入的了解:数据对齐:直起并右飞

想象一下地址必须是16字节对齐的情况,例如PS3。然后假设位移== 1。这肯定是一个非16字节对齐的指针,这在这台机器上是行不通的。