我正在探索内存对齐和填充,并认为我已经掌握了窍门,直到我遇到了这个:
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的结构体的内存对齐?
1条答案
按热度按时间r6vfmomb1#
long long x;
需要对齐8,编译器添加4字节填充以使Example2
数组中的元素正确对齐。unsigned char x[8];
不需要任何对齐,Example3
数组中的元素不需要对齐,因此编译器不添加填充字节,但它可以添加它们,这是特定于实现的。