面试题答案
一键面试C++ 结构体和联合体内存布局不同点
- 结构体:
- 结构体的成员按照声明顺序依次存储在内存中。各个成员变量在内存中是相互独立存储的,它们之间可能存在内存对齐的情况,目的是为了提高内存访问效率。例如,一个结构体中有一个
char
类型成员(占1字节)和一个int
类型成员(通常占4字节),char
之后可能会填充一些字节,使得int
成员的地址满足其对齐要求(通常是4字节对齐)。
- 结构体的成员按照声明顺序依次存储在内存中。各个成员变量在内存中是相互独立存储的,它们之间可能存在内存对齐的情况,目的是为了提高内存访问效率。例如,一个结构体中有一个
- 联合体:
- 联合体所有成员共享同一块内存空间,其大小取决于占用内存最大的成员。例如,一个联合体中有一个
char
类型成员(占1字节)和一个int
类型成员(通常占4字节),该联合体的大小就是4字节,因为int
成员占用空间最大。联合体在同一时间只能有一个成员处于有效状态,对一个成员的赋值会覆盖其他成员的值。
- 联合体所有成员共享同一块内存空间,其大小取决于占用内存最大的成员。例如,一个联合体中有一个
计算内存大小示例
- 结构体:
#include <iostream>
struct MyStruct {
char a; // 1字节
int b; // 4字节,假设32位或64位系统下int占4字节
short c; // 2字节
};
int main() {
std::cout << "MyStruct size: " << sizeof(MyStruct) << " bytes" << std::endl;
return 0;
}
在上述代码中,MyStruct
结构体中,a
占1字节,由于 int
通常4字节对齐,a
后可能填充3字节,b
占4字节,c
占2字节,又因为整体要满足最大对齐数(这里是 int
的4字节对齐),c
后可能再填充2字节。所以 sizeof(MyStruct)
结果通常为1 + 3 + 4 + 2 + 2 = 12字节。
2. 联合体:
#include <iostream>
union MyUnion {
char a; // 1字节
int b; // 4字节,假设32位或64位系统下int占4字节
short c; // 2字节
};
int main() {
std::cout << "MyUnion size: " << sizeof(MyUnion) << " bytes" << std::endl;
return 0;
}
在上述代码中,MyUnion
联合体中,由于所有成员共享内存,其大小取决于最大成员 int
,所以 sizeof(MyUnion)
结果为4字节。