c++对齐-严格和弱
C++ alignment - strict and weak
我正在阅读N3485 c++标准草案,在对齐部分,它陈述如下:
3.11 align [align]
1…对齐是实现定义的整数值,表示分配给定对象的连续地址之间的字节数。对象类型对该类型的每个对象施加对齐要求;可以使用对齐说明符(7.6.2)请求更严格的对齐。
这里说明了对齐是什么,我明白了。这意味着如果你有一个32位(4字节)的系统,它将一次读取4字节大小的块,所以你应该把东西放在内存中的4字节偏移地址。很多这些都是由一个好的编译器处理的,但是c++也让你有自己的发言权。
它所说的对齐指示符是alignas
。
您可以将一个整数传递给alignas
来指定您的对齐要求,或者像alignas(double)
这样的类型
现在,您有弱对齐或严格对齐,说明如下:
5排列顺序从弱到强或更严格比对。严格对齐有更大的对齐值。满足对齐要求的地址也满足任何较弱的有效对齐要求。
7比较排列是有意义的,并且提供了明显的结果:
-当两个对齐的数值相等时,它们相等。
-当数值不相等时,两个对齐方式是不同的。
- 当一种对齐方式比另一种更大时,它表示更严格的对齐。
这里说的是更严格的对齐是更大的对齐。这是否意味着alignas(8)
比alignas(4)
更严格?在32位(4字节)系统上,8版本意味着int
类型将需要两次读取而不是一次,并且只有一次填充。严格是指当对齐被"误用"时,它会给CPU带来潜在的开销,就像这个愚蠢的例子一样吗?
我意识到不是所有的对齐在给定的系统上都是有效的,为了产生正确的行为,扩展的对齐必须是有效的。
对我来说,对齐是让CPU以字大小的块访问内存数据,这是CPU从内存中读取和写入数据的最优方式。
按照我的理解,这种严格的对齐可能会破坏它。我错了吗?什么是严格对齐与弱对齐?
这里的"strict"仅仅是指更大的对齐值在可能的地址方面有更多的限制。
对齐方式为8的有效地址只有对齐方式为4的一半,因此对齐方式为8的类型在放置位置方面受到更多限制。
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 是否值得对齐变量?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 对齐和对齐的实际用例C++关键字
- 如何减少代码的运行时间以对齐文本?
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- Linux C++ 中的页面对齐内存分配
- C++ 类层次结构中的"对齐"是什么意思?
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 具有调整对齐方式的类型定义
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?