面试题答案
一键面试1. 结构体和联合体内存布局差异
- 结构体:结构体的内存布局是各个成员变量按照定义顺序依次排列,内存大小为所有成员变量大小之和,可能存在内存对齐。例如:
struct SensorData1 {
char sensorID;
int sensorValue;
};
在32位系统下,char
占1字节,int
占4字节,考虑内存对齐(一般按4字节对齐),该结构体大小为8字节。
- 联合体:联合体所有成员共享同一块内存空间,其大小为最大成员的大小。例如:
union SensorData2 {
char sensorID;
int sensorValue;
};
上述联合体大小为4字节(int
类型大小)。
2. 设计数据结构
- 结构体设计:为最大化利用内存空间,尽量将小数据类型放在前面,减少内存空洞。例如:
struct SensorData {
char sensorID;
short sensorType;
int sensorValue;
};
这样在32位系统下,按照4字节对齐,该结构体大小为8字节,比 int
在前的布局节省4字节。
- 联合体设计:对于需要在不同设备间传输的数据,将可能出现的不同数据类型用联合体封装,确保传输时占用最小内存。例如:
union TransferData {
char charData;
short shortData;
int intData;
};
- 综合设计:可以设计一个结构体,内部包含联合体,以满足不同需求。
struct SensorPacket {
char sensorID;
union {
char charData;
short shortData;
int intData;
} data;
};
3. 不同平台下的调整
- 32位系统:上述设计基本适用,注意按照4字节对齐原则设计结构体。
- 64位系统:
- 内存对齐:通常按8字节对齐。在结构体设计时,需要重新考虑成员顺序以减少内存浪费。例如,对于前面的
struct SensorData
,在64位系统下,按照8字节对齐,其大小为16字节。可调整为:
- 内存对齐:通常按8字节对齐。在结构体设计时,需要重新考虑成员顺序以减少内存浪费。例如,对于前面的
struct SensorData {
char sensorID;
short sensorType;
int sensorValue;
char padding[2]; // 手动添加填充,使结构体大小为8字节倍数
};
- **数据类型大小**:虽然联合体设计思路不变,但要注意不同数据类型在64位系统下的大小变化,例如指针类型在32位系统占4字节,在64位系统占8字节。确保联合体中的成员类型选择合理,以适应不同平台的内存需求。