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)
它被批评为不符合内存对齐规则.你可以解释为什么这种方法从内存对齐的角度来看是有缺陷的?一个不起作用的例子将受到高度赞赏.我知道这通常是一种糟糕的方法,但我经常在网络协议实现中使用它,所以它比理论问题更实际.
另外请不要在这里提到严格别名,这是另一个问题.
非堆分配的数组char对其对齐没有特定要求.所以你的1000个字符的缓冲区可能是奇数偏移量.int如果编译器没有将其拆分为单独的读取+位掩码操作,那么尝试从该偏移量读取(重新解释为明显的int指针)会导致性能不佳甚至某些硬件上的总线错误.
char保证堆分配的数组适当地对齐以存储任何对象类型,因此这始终是一个选项.
对于非堆基存储,使用boost::aligned_storage它可确保空间正确对齐以供一般使用.
| 归档时间: |
|
| 查看次数: |
423 次 |
| 最近记录: |