一、语言特性与底层原理
1. 内存管理:炼金术般的精细操作
- new/delete vs malloc/free:
C++的new/delete与C的malloc/free核心差异在于类型安全、构造/析构函数调用及异常处理。例如,new在分配内存时会自动调用构造函数初始化对象,而malloc仅分配裸内存。面试中常考内存泄漏检测工具(如Valgrind)的原理,其通过追踪内存分配与释放路径定位泄漏点。 - 智能指针三重境界:
unique_ptr(独占所有权)、shared_ptr(引用计数+控制块)、weak_ptr(解决循环引用)是高频考点。例如,shared_ptr的引用计数通过控制块实现,而weak_ptr不增加计数,仅作为观察者存在。
2. 指针与引用:灵魂拷问
- 七层本质差异:
指针可修改指向,引用不可;指针可为NULL,引用必须初始化。例如,函数参数传递时,引用能避免拷贝且保证数据一致性。 - const关键字四重封印:
常量指针(const int* p)、指针常量(int* const p)、常量成员函数(void func() const)及常量引用参数(void print(const string& str))是考点重点。
3. 面向对象:虚函数与多态
- 虚函数表(vTable) :
类内存布局包含虚函数表指针,子类覆盖虚函数时会更新vTable。例如,动态绑定通过vTable实现,而静态绑定在编译期确定。 - 纯虚函数设计哲学:
纯虚函数(virtual void draw() = 0)强制子类实现接口,是抽象类的核心特征。面试中常考虚析构函数的必要性,以避免基类指针删除子类对象时的内存泄漏。
二、多线程与并发编程
1. 线程管理:C++11的革新
- std::thread与同步机制:
C++11的std::thread简化了线程创建,而互斥锁(std::mutex)、条件变量(std::condition_variable)是线程同步的关键。例如,生产者-消费者模型中,条件变量用于线程间通信。 - 原子操作与死锁避免:
原子操作(如std::atomic)保证不可分割性,避免数据竞争。死锁避免策略包括固定加锁顺序、尝试一次性获取所有锁(std::lock)及超时机制。
2. 线程安全设计模式
- 单例模式实现:
饿汉模式(线程安全但可能浪费资源)与懒汉模式(需双重检查锁定)是经典考题。C++11后,局部静态变量初始化保证线程安全。 - 线程池设计:
通过任务队列与工作线程复用减少开销,面试中常考任务调度与负载均衡策略。
三、STL与标准库
1. 容器与算法:底层实现
- vector扩容策略:
GCC采用2倍扩容,VS采用1.5倍,以平衡时间与空间。迭代器失效是高频考点,如push_back导致扩容时,原有迭代器全部失效。 - map与unordered_map对比:
红黑树实现的有序性与哈希表的O(1)访问是核心区别。面试中常考插入、删除的时间复杂度及适用场景。
2. 内存模型与性能优化
- 内存对齐与缓存命中率:
结构体按最大成员对齐,可通过#pragma pack手动控制。高缓存命中率需通过数据局部性原则优化内存布局。 - 内存池技术:
预分配大块内存减少频繁分配开销,常见于高性能服务器设计。
四、设计模式与架构
1. 创建型模式:单例与工厂
- 单例模式:
线程安全实现(如静态内部类)及双重检查锁定是考点。 - 工厂方法模式:
通过工厂类解耦对象创建与使用,符合开闭原则。
2. 结构型模式:代理与装饰器
- 代理模式:
控制对象访问(如权限校验),与装饰器模式的动态添加职责形成对比。 - 装饰器模式:
比继承更灵活,如IO流链式调用(ifstream >> buffer)。
3. 行为型模式:观察者与策略
- 观察者模式:
主题-观察者解耦,常见于事件驱动系统(如GUI按钮点击)。 - 策略模式:
算法族封装,通过上下文类动态切换策略(如排序算法选择)。
五、备考策略与实战建议
1. 系统复习与刷题
- 核心知识图谱:
覆盖C++11/14/17新特性(如lambda、移动语义)、数据结构(树、图、哈希表)、算法(动态规划、贪心)及操作系统(进程、内存管理)。 - 刷题平台:
LeetCode(重点200题)、牛客网(《剑指Offer》)、Codeforces(提升编码速度)。
2. 项目与实战经验
- 高价值项目方向:
高性能网络库(基于epoll)、简易STL实现(模板编程)、内存池/线程池设计。 - 代码质量:
遵循Google C++ Style,编写单元测试(gtest),通过Git管理代码版本。
3. 面试专项训练
- 手撕代码:
白板编程注重边界条件(如空指针、越界访问),代码简洁性(如避免冗余判断)。 - 系统设计:
设计线程池(任务队列+工作线程)、分布式缓存(一致性Hash)、限流算法(令牌桶)。 - 行为面试:
准备“宝洁八大问”类问题(如克服的最大挑战),熟悉简历项目细节(如技术选型、优化成果)。