堆分配变量的结构成员对齐
Alignment of structure members for heap allocated variables
我有一个结构,其中成员有一定的对齐要求,而结构本身不存在这样的要求。
我正在使用 gcc,所以使用 __attribute__((aligned(n((( 就可以解决问题,除非(据我所知(在堆上分配了结构的实例。
如何保持堆分配实例的对齐方式? posix_memalign(3( 将对齐结构本身,但不对齐结构成员,所以我看不出如何使其与该函数一起使用。
来源在这里: https://github.com/colding/disruptorC/blob/master/src/disruptor.h#L92
无论结构位于何处(堆栈或堆(,结构的布局都必须相同。编译器确保结构中元素的sizeof()
和布局与对齐要求匹配(通过填充(。它还为结构本身提供了所需的对齐方式,以便其成员最终位于右侧边界上(此值是其任何成员的最大对齐方式(。
所以只要使用posix_memalign
,你就会没事的:
MyStruct* ptr;
posix_memalign(&ptr, alignof(MyStruct), sizeof(MyStruct));
例如,如果您有以下定义:
struct MyStruct {
char c;
double d;
}
当然,它依赖于编译器,但最有可能的行为是编译器列出以下内容:
- 1 字节字符
- 7 字节填充
- 8 字节双精度
并给整个事情一个 8 字节的对齐。然后,如果结构本身正确对齐(在 8 字节边界上(,则偏移量为 8 字节的双精度也将正确对齐。
(alignof
在不同的编译器/标准中是不同的:__alignof__
在 gcc 中,__alignof
在 MSVC 中,alignof
在 C11/C++11 中。
相关文章:
- vcpkg:指定结构成员对齐方式
- 如何在结构中组织成员以在对齐上浪费最少的空间
- 如何使派生的类成员对齐,以使第一个成员立即出现在基类的最后一个成员之后
- 对齐说明符:在类型 / 上 成员数据
- 对齐的成员变量和动态分配
- 结构对齐填充、最大填充大小和结构成员顺序
- 对齐构件的对齐结构为成员(C )
- C / GSOAP 2.8.2中的怪异结构成员对齐
- 堆分配变量的结构成员对齐
- 无法访问 std::vector 的 16 位对齐成员
- 内存对齐到结构-对齐大小等于最大成员大小
- 具有对齐成员的结构的c++对齐
- 具有对齐成员的对象的动态分配-可能的解决方案
- 运行时结构成员的对齐
- 在相同类型的数组成员之后对齐
- 在ARM上的c++结构成员对齐和封装要求
- c++根据结构大小或其成员之间的最大对齐要求进行对齐
- 结构成员和静态变量的对齐
- MSVC 2008 16字节结构成员对齐奇怪
- GCC中的结构成员对齐