面试题答案
一键面试利用union优化结构体内存使用
#include <stdio.h>
// 定义指令类型枚举
typedef enum {
TYPE_1 = 1,
TYPE_2 = 2,
TYPE_3 = 3
} InstructionType;
// 利用union优化内存使用
union Data {
int32_t intValue;
double floatValue;
char charArray[16];
};
// 定义包含指令类型和数据的结构体
typedef struct {
InstructionType type;
union Data data;
} Instruction;
确保访问数据成员时的正确性
为确保访问数据成员时的正确性,在访问union
中的数据成员之前,必须先确定当前的type
。例如:
void processInstruction(Instruction instr) {
switch (instr.type) {
case TYPE_1:
printf("Type 1: Integer value = %d\n", instr.data.intValue);
break;
case TYPE_2:
printf("Type 2: Floating - point value = %lf\n", instr.data.floatValue);
break;
case TYPE_3:
printf("Type 3: Character array = %s\n", instr.data.charArray);
break;
default:
printf("Unknown instruction type\n");
}
}
不同编译器和平台下可能存在的问题
- 字节对齐:不同的编译器和平台对
union
的字节对齐方式可能不同。例如,某些平台可能要求double
类型的变量在特定的内存地址边界上对齐,这可能导致union
的大小并非是其最大成员的大小,而是根据对齐规则有所增加。比如在32位系统上,int
可能是4字节对齐,double
可能是8字节对齐,如果union
中同时包含int
和double
,其大小可能是8字节而非4字节(为了满足double
的对齐要求)。 - 字节序:不同平台可能采用不同的字节序(大端或小端)。当从
union
中读取多字节数据(如int32_t
或double
)时,字节序的差异会导致数据解释错误。例如,在大端字节序系统中,高位字节在前,而小端字节序系统中,低位字节在前。如果在一个字节序下写入union
的数据,在另一个字节序的系统中读取,会得到错误的结果。 - 编译器扩展:一些编译器可能会提供与
union
相关的扩展特性,这些特性在不同编译器间可能不兼容。例如,某些编译器可能允许在union
中定义构造函数和析构函数等C++ 特性,这在标准C语言中是不允许的,并且在其他编译器中可能无法编译通过。