- 结构体A的定义及分析:
struct A {
char arr[3];
short num1;
int num2;
};
- 内存布局分析:
char arr[3]
占用3个字节。
short num1
通常占用2个字节。由于内存对齐规则,short
类型变量存储地址需要是2的倍数,而char arr[3]
占用3个字节,所以在arr
之后会填充1个字节,使得num1
的起始地址是2的倍数。
int num2
通常占用4个字节。它的起始地址需要是4的倍数,此时前面arr
和num1
以及填充字节共占用6个字节,所以在num1
之后会填充2个字节,使得num2
的起始地址是4的倍数。
- 结构体A的大小:
3 + 1 + 2 + 2 + 4 = 12
字节。
- 结构体B的定义及分析:
struct B {
struct A a;
double num3;
};
- 内存布局分析:
- 结构体B包含结构体A,结构体A大小为12字节。
double num3
通常占用8个字节。double
类型变量存储地址需要是8的倍数,而结构体A占用12字节,所以在结构体A之后会填充4个字节,使得num3
的起始地址是8的倍数。
- 结构体B的大小:
12 + 4 + 8 = 24
字节。
- 内存对齐规则:
- 规则1:结构体成员的起始地址必须是该成员大小的整数倍:例如
short
类型成员起始地址要是2的倍数,int
类型成员起始地址要是4的倍数,double
类型成员起始地址要是8的倍数等。
- 规则2:结构体的总大小必须是其最大成员大小的整数倍:在结构体A中,最大成员是
int
类型,大小为4,所以结构体A总大小是12(4的整数倍)。在结构体B中,最大成员是double
类型,大小为8,所以结构体B总大小是24(8的整数倍)。