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

时间:2012-08-21 14:16:39

标签: c++ c gcc

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

我正在使用gcc,所以使用__attribute __((aligned(n)))将会解决问题,除非(据我所知)在堆上分配了一个struct实例。

如何保持堆分配实例的对齐? posix_memalign(3)将对齐结构本身,但不对齐结构成员,因此我无法看到如何使其与该函数一起使用。

来源位于:https://github.com/colding/disruptorC/blob/master/src/disruptor.h#L92

1 个答案:

答案 0 :(得分:2)

无论结构是堆栈还是堆,结构的布局必须相同。编译器确保结构中的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在不同的编译器/标准中有所不同:gcc中为__alignof__,MSVC中为__alignof,C11 / C ++ 11中为alignof。)