面试题答案
一键面试联合存储(union)内存分配规则
- 占用内存:联合存储占用的内存空间是其最大成员所需要的空间。例如:
union Data {
int i;
float f;
char c[4];
};
在上述联合 Data
中,int
通常占4字节,float
通常也占4字节,char[4]
占4字节。所以 union Data
占用4字节内存空间。
- 内存共享:联合的所有成员共享同一块内存空间,在某一时刻只有一个成员的值是有效的。
利用联合存储进行内存对齐优化及提升数据访问效率
- 示例:假设我们有一个复杂数据结构,其中包含不同大小的数据类型,并且我们希望根据不同场景访问不同类型数据,同时优化内存使用。
union ComplexData {
struct {
uint8_t field1;
uint16_t field2;
uint32_t field3;
} parts;
uint64_t whole;
};
在这个例子中,struct
中的 field1
占1字节,field2
占2字节,field3
占4字节。由于内存对齐,struct
整体会占用8字节(field1
占1字节,为对齐 field2
补齐1字节,field2
占2字节,field3
占4字节)。uint64_t
也占8字节。这样,使用联合存储,无论以 struct
方式访问(不同字段分别访问)还是以 uint64_t
整体访问,都能有效利用内存,并且在某些场景下提升数据访问效率。
联合存储中包含结构体时的内存布局和访问逻辑
- 内存布局:
- 联合本身的内存布局遵循上述规则,即占用空间为最大成员的空间。
- 对于联合中的结构体,结构体自身的内存布局遵循结构体的内存对齐规则。例如:
struct InnerStruct {
char a;
int b;
};
union OuterUnion {
struct InnerStruct inner;
long long c;
};
在 InnerStruct
中,char
占1字节,为对齐 int
(通常4字节),InnerStruct
会占用8字节(a
占1字节,补齐3字节,b
占4字节)。OuterUnion
占用8字节,因为 long long
(通常8字节)是最大成员。
2. 访问逻辑:
- 当访问联合中的结构体成员时,按照结构体成员的访问方式访问。例如:
OuterUnion u;
u.inner.a = 'x';
u.inner.b = 10;
- 当以联合的其他成员方式访问时,要注意数据的一致性和类型转换。例如:
long long value = u.c;
// 此时value的值取决于之前对u.inner的赋值情况,需要根据业务逻辑确保数据理解正确