这篇文章就是分析面试问题背后的需求,从而实现举一反三的面试效果
面试官:请算出XXX结构体的大小
考点:字节对齐
出现的原因:
- 为了部分老版本的CPU架构不支持非对齐访问的问题
- 提高本地内存的读取效率。
原则:
- 结构体变量的首地址能够被其对齐字节数大小(系统寻址大小,受系统位数影响)所整除。
- 结构体每个成员相对结构体首地址的偏移都是对应成员大小的整数倍,如不满足,对前一个成员填充字节以满足。
- 结构体的总大小为结构体对最大成员大小的整数倍,如不满足,结构体最后填充字节以满足。
缺点:1,数据存储,会造成数据冗余;2,网络通信,收发平台不一致,导致解析出错;
面试官:请介绍纯虚函数
考点:纯虚函数、抽象类、接口类
出现的原因:只要有纯虚函数的类都叫做抽象类,该函数细节由派生类决定
抽象类出现原因:为了实现多态,服务于面向对象;将具体对象抽离出共性,减少代码重复度;常见使用场景是抽象工厂模式
原则:
- 纯虚函数,首先是虚函数,其次是没有具体实现过程,写作=0
- 抽象类一般使用方法,基类指针指向派生类对象,直接使用基类指针进行算法运算
面试官:静态类函数存放在哪?静态成员呢?什么时候被创建?什么时候被初始化?
考点1:程序的五层内存存储
作用:将内存划分不同区域,方便管理,对应不同的生命周期
内容:
区域 | 作用 | 表现形式(按内存中顺序排列) | 生命周期 |
---|---|---|---|
代码段 | 存放函数体的二进制代码,运行时被调用 | 类成员函数…全局函数…静态类成员函数 | 程序中止 |
全局段 | 生命周期最长,全局变量编译时分配,其他类变量第一次使用时分配 | 全局变量…静态类变量…静态自然变量 | 程序中止 |
常量段 | 只读的数据,减少内存使用 | ‘123’,123 | 程序中止 |
栈 | 编译器自动分配释放 | 函数的参数值,局部变量 | 函数中止 |
堆 | 按需申请 | 程序员主动申请的内存块 | 主动释放 |
注意:类成员若未被初始化(使用)的话,程序内存占用是没有变化的,除非初始化过。
面试官:内联函数的作用
考点:inline关键字
原本的作用:在使用该函数的地方,将函数视为一段代码段,减少函数开栈,提高性能
后面编译器自动检查函数是否符合内联要求,自动优化
因上述的原因,委员会对inline关键字进行升级(废物利用)
附加作用(C++17):定义写在.h文件中,在被多个地方引用该头文件,也不会出现重复定义报错😀。