面试题答案
一键面试内存布局分析
- 不同编译器下的差异:
- 在C++中,
struct
和union
的内存布局会受到编译器的对齐规则影响。对齐规则旨在提高内存访问效率,不同编译器的对齐规则可能略有不同,但通常遵循一些基本原则。 - 对于
union
,其大小是其最大成员的大小,以满足所有成员都能在该空间中存储。在本题中,char
通常占1字节,short
通常占2字节,所以union
的大小为2字节(假设short
大小为2字节)。 - 对于
struct
,其大小不仅取决于成员的大小,还取决于对齐规则。一般来说,struct
的大小是其最大对齐成员大小的倍数。这里int
(假设int
大小为4字节)是struct
中最大对齐成员。 - 例如,在某些编译器下,
struct
的成员会按照其自身的对齐要求进行对齐。int
类型的对齐要求可能是4字节(不同系统可能不同),union
的对齐要求是其最大成员short
的对齐要求,假设short
对齐要求为2字节。struct
的布局可能是这样:先放置int
类型成员a
,占用4字节,然后放置union
,union
本身大小为2字节,但为了满足int
的4字节对齐要求,union
后可能会填充2字节,所以整个struct
大小为8字节。 - 然而,有些编译器可能有更严格或不同的对齐策略,可能会将
union
的对齐也设置为4字节(与int
相同),这样union
大小为4字节(因为要满足4字节对齐,即使union
实际最大成员为2字节),整个struct
大小也是8字节。但也有一些编译器可能会采用更紧凑的布局方式,在满足所有成员对齐要求的前提下尽量减少空间浪费。
- 在C++中,
计算该struct
大小的代码示例
#include <iostream>
struct MyStruct {
int a;
union {
char b;
short c;
};
};
int main() {
std::cout << "Size of MyStruct: " << sizeof(MyStruct) << " bytes" << std::endl;
return 0;
}
在上述代码中,通过sizeof(MyStruct)
计算并输出MyStruct
结构体的大小。实际运行结果会因编译器和系统的对齐规则不同而有所差异。