1

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

我正在使用 gcc,因此使用 __attribute__((aligned(n))) 可以解决问题,除非(据我所知)在堆上分配了结构的实例。

如何保持堆分配实例的对齐?posix_memalign(3) 将对齐结构本身,而不是结构成员,所以我看不出如何使它与该函数一起工作。

来源在这里:https ://github.com/colding/disruptorC/blob/master/src/disruptor.h#L92

4

1 回答 1

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在不同的编译器/标准中有所不同:__alignof__在 gcc、__alignofMSVC 和alignofC11/C++11 中。)

于 2012-08-21T14:20:40.613 回答