1. 结构体与联合体的本质区别
1.1 内存分配机制对比
结构体(struct)和联合体(union)最根本的区别在于内存分配方式。结构体的每个成员拥有独立的内存空间,而联合体的所有成员共享同一块内存区域。举个例子:
c复制struct SampleStruct {
int a; // 占4字节
char b; // 占1字节
double c; // 占8字节
}; // 总大小通常为16字节(考虑对齐)
union SampleUnion {
int a; // 占4字节
char b; // 占1字节
double c; // 占8字节
}; // 总大小为8字节(按最大成员对齐)
实际开发中,结构体适合需要同时保存多个相关数据的场景,比如学生信息记录(学号+姓名+成绩)。而联合体常用于需要节省内存或同一时刻只需使用一种数据类型的场景,比如网络协议包头解析。
1.2 成员访问的互斥性
联合体的成员访问具有互斥性——修改一个成员会覆盖其他成员的值。这是因为它们共享内存空间。结构体则不存在这个问题,各成员的值可以独立修改和读取。这个特性决定了它们的典型应用场景:
- 结构体:数据需要长期共存(如3D坐标点x,y,z)
- 联合体:数据分时复用(如存储温度值,可能是整数或浮点数)
注意:在C++中,联合体可以包含带构造函数的类成员,但需要手动管理内存生命周期,这是高级用法中的常见坑点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 内存对齐的底层原理
2.1 硬件访问效率的真相
现代CPU并非按字节粒度访问内存,而是以固定大小的块(通常4/8字节)为单位。假设一个int变量跨越两个4字节块,CPU需要执行两次内存访问再加拼接操作,性能直接腰斩。内存对齐就是通过合理排列数据位置来避免这种情况。
实测案例:在x86_64架构下,对比对齐和非对齐数据访问:
c复制// 对齐访问
struct Aligned { char pad; int val; }; // 编译器自动插入padding
// 非对齐访问
struct Unaligned { char a; char b; int val; }; // val可能不对齐
基准测试显示,Unali
