在哪里可以找到关于跨不同平台/编译器的c++内存对齐的文档?
Where can I find documentation on C++ memory alignment across different platforms/compilers?
我正在寻找一个好的(全面的)文档,关于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字节对齐的指针,这在这台机器上是行不通的。
相关文章:
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我需要知道编译器如何在cpp中使用析构函数
- 编译器如何区分std::vector的构造函数
- CLANG 编译器 说:变量"PTR"可能未初始化
- 告诉c++编译器该参数没有别名
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么所有C++编译器都会崩溃或挂起此代码
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 为什么C++编译器没有检测到正确声明的类?