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

标签 c++ c gcc

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

我正在使用 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字节 double

并给整个东西一个 8 字节的对齐。然后,如果结构本身正确对齐(在 8 字节边界上),则向其中偏移 8 字节的 double 也将正确对齐。

(alignof在不同的编译器/标准中是不同的:gcc中的__alignof__,MSVC中的__alignof,以及alignof 在 C11/C++11 中。)

关于c++ - 堆分配变量的结构成员对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12056866/

相关文章:

gcc预处理后能输出C代码吗?

c - AVR - AT90CAN128,随机跳转代码

c - 如何指向整个数组

c++不在数组边界中的元素的值是什么

c++ - exit() 或异常会阻止调用范围结束的析构函数吗?

c++ - 在 C/C++ 中调试 : cost of calling an empty function

c - 使用 String 逐字打印(换行)

c++ - boost 预处理器 : Sample not working

c - 在 gcc 中打开优化后标签移动

c++ - 将静态链接库变成动态链接库