c++ 为什么包含类型T的数组的结构的内存对齐总是1

jv4diomz  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(132)

我正在探索内存对齐和填充,并认为我已经掌握了窍门,直到我遇到了这个:

struct Example {
   int x1; // 4
   char c; // 1 + 3 padding
   int x2; // 4
};

static_assert(sizeof Example == 12, "Incorrect size");  // OK

struct Example2 {
   long long x; // 8
   Example y;   // 12
                // 4 bytes padding
};

static_assert(sizeof Example2 == 24, "Incorrect size"); // OK
    
struct Example3 {
   unsigned char x[8];     // 8
   unsigned char y[12];    // 12
                           // 4 bytes padding??
};

static_assert(sizeof Example3 == 24, "Incorrect size"); // ERROR

我在一个64位系统上,用的是MSVC x64编译器.为什么它总是计算只有数组类型为1的结构体的内存对齐?

r6vfmomb

r6vfmomb1#

long long x;需要对齐8,编译器添加4字节填充以使Example2数组中的元素正确对齐。
unsigned char x[8];不需要任何对齐,Example3数组中的元素不需要对齐,因此编译器不添加填充字节,但它可以添加它们,这是特定于实现的。

相关问题