面试题答案
一键面试数据结构设计
// 定义联合体来包含不同访问方式的数据
union RegisterAccess {
uint32_t word; // 按字访问
struct {
uint8_t byte0;
uint8_t byte1;
uint8_t byte2;
uint8_t byte3;
} bytes; // 按字节访问
};
// 定义结构体来管理寄存器
struct HardwareRegister {
union RegisterAccess value;
};
简化底层代码操作
通过这种设计,在底层代码中可以根据需要直接访问联合体中的不同成员。例如,如果需要按字写入寄存器,可以这样操作:
struct HardwareRegister reg;
reg.value.word = 0x12345678;
如果需要按字节读取寄存器的某一部分,可以这样:
uint8_t part = reg.value.bytes.byte2;
这样就避免了复杂的位运算,使代码更加直观、简洁,易于理解和维护。
保证数据准确性和效率
- 准确性:由于联合体共享内存空间,无论以何种方式访问(按字节或按字),操作的都是同一个物理内存位置,所以数据一致性得到保证。例如对
word
成员赋值后,bytes
成员的相应字节值也会同步更新,反之亦然。 - 效率:这种设计直接映射到硬件寄存器的不同访问方式,不需要额外的转换操作。在底层代码中,对寄存器的读写操作直接对应到联合体成员的访问,减少了计算开销,提高了代码执行效率。同时,由于结构体和联合体的内存布局是紧凑的,没有额外的填充字节浪费内存,在嵌入式系统中内存资源有限的情况下,也提高了内存使用效率。