1.常见八股
1.1 struct 定义 short、int、char 最后这个结构体的大小是多少?
结构体的内存大小由成员的大小(由sizeof运算符计算)和对齐规则决定,假设结构体的定义为:
1
2
3
4
5
struct Example {
short s; // 2字节
int i; // 4字节
char c; // 1字节
};
内存布局分析(以4字节对齐为例):
short s:占用 0-1 字节。
int i:需对齐到 4 字节,因此从 4 开始,占用 4-7 字节。
char c:占用 8 字节。
总大小:8 + 1 = 9 字节。但结构体整体需对齐到最大成员(int 的 4 字节),因此填充 3 字节,最终大小为 12 字节。
注:编译器对齐规则可通过
#pragma pack(n)修改对齐方式。
1.2 堆栈分别是干啥的?
1.2.1 栈
用于存储函数调用时的临时数据,例如:
- 局部变量(如
int x = 10;)。 - 函数参数(如
func(a, b)中的a和b)。 - 函数返回地址(调用结束后回到哪里继续执行)。
特点:自动管理,高效快速,大小固定,线程私有。
1.2.2 堆
用于动态分配不确定生命周期或大块的内存,例如:
- 动态创建的复杂对象(如
new Object())。 - 全局需要长期使用的数据(如缓存、文件内容)。
特点:
- 手动管理:需要开发者主动分配(如 malloc、new)和释放(如 free、delete)
- 灵活但复杂、空间较大、全局共享。
1.3 指针和引用有什么区别?
指针和引用都是变量,但两者的区别在于:
- 指针可以直接指向任意内存地址,而引用只能指向对象。
- 指针可以修改所指对象的值,而引用的值不可修改。
- 指针占用内存大小相同,但引用占用内存大小相同或更小。