面试题答案
一键面试内存分配方式不同点
- 结构体(struct):结构体的内存分配是按照成员变量声明的顺序依次分配内存,成员变量之间紧密排列,可能会存在内存对齐。结构体的总大小是所有成员变量大小之和,再加上由于内存对齐引入的额外字节。
- 联合体(union):联合体所有成员共享同一块内存空间,其内存大小取决于最大成员变量的大小。联合体的总大小是最大成员变量大小向上取到内存对齐边界的大小。
计算内存大小示例
- 结构体示例
struct ExampleStruct {
char a; // 1字节
int b; // 4字节
short c; // 2字节
};
在常见的32位或64位系统中,由于内存对齐,char
类型后会填充3个字节,使int
从4字节对齐地址开始存储。short
后也可能填充2个字节。所以ExampleStruct
的大小为1 + 3 + 4 + 2 + 2 = 12
字节。
2. 联合体示例
union ExampleUnion {
char a; // 1字节
int b; // 4字节
short c; // 2字节
};
ExampleUnion
的大小取决于最大成员int
,由于内存对齐,int
本身就满足对齐要求,所以ExampleUnion
大小为4字节。