堆分配变量的结构成员对齐

Alignment of structure members for heap allocated variables

本文关键字:成员 对齐 结构 分配 变量      更新时间:2023-10-16

我有一个结构,其中成员有一定的对齐要求,而结构本身不存在这样的要求。

我正在使用 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 中。