C++面试题总结
1. c++ 内存模型
栈 | 存放局部变量,大小受限一般为2M,由编译器自动管理其内存 | ||||
堆 | 存放new创建的对象,需要手动创建和释放内存 | ||||
全局/静态区 | 存放全局及静态变量,又分为两块
| ||||
代码段 | 存放代码和const常量,是只读的 |
2. STL介绍
STL包含六大组件:容器、算法、迭代器、仿函数、空间置配器、适配器
2.1 容器
关联性容器 |
| ||||||||||
序列式容器 |
| ||||||||||
容器适配器 | 对 vector、deque 或 list 进行封装
|
2.2 算法
常用的有:sort、reserve、sum、find
2.3 迭代器
本质是一个模板类,通过重载了指针的一些操作符模拟了指针的一些功能,迭代器返回的是对象引用而不是对象的值
2.4 仿函数
是一种特殊的类或结构体,通过重载operator()操作符,使得类能够像函数一样被调用,可以和算法一起结合使用
// 定义一个仿函数类
class Add {
public:int operator()(int a, int b) {return a + b;}
};// 自定义比较仿函数(降序排序)
struct Compare {bool operator()(int a, int b) {return a > b;}
};int main() {Add add; std::cout << add(3, 5) << std::endl; // 输出 8std::vector<int> vec = {3, 1, 4, 1, 5, 9};std::sort(vec.begin(), vec.end(), Compare()); // 使用仿函数进行排序for (int num : vec) {std::cout << num << " ";}return 0;
}
相比匿名函数,仿函数可以有更复杂的逻辑封装,有成员变量可以保持数据状态。
2.5 空间配置器
通常容器的空间配置器使用std::allocator 进行内存管理,当然也可以自定义allocator。vecor、list、map默认使用allocator作为内存分配工具。
操作 | std::allocator | 自定义 Allocator |
---|---|---|
内存分配 | allocate(n) | 通过 ::operator new |
构造对象 | construct(p, args...) | new (p) T(args...) |
销毁对象 | destroy(p) | 调用 p->~T() |
释放内存 | deallocate(p, n) | 通过 ::operator delete |
适用场景 | STL 容器默认使用 | 适用于特定性能优化 |
由于频繁创建和销毁对象会消耗大量资源,降低程序性能,产生内存碎片,而内存池解决了这一问题;预先分配一块内存,使用时从内存池中取出,不需要时放回内存池,省去创建和销毁的开销,提供程序效率,减少内存锁片。
自定义内存池可以使用自定义链表结构体、或基于allocator,allocator的每个内存大小相同,总内存块固定。
3. 多线程
线程是任务调度的基本单位,进程是操作系统分配内存的基本单位 ;一个进程可以包含多个线程;同一个进程下的线程共享同一个内存空间,不同进程间内存不共享
3.1 线程定义
#include <iostream>
#include <thread>void hello() {std::cout << "Hello from thread!" << std::endl;
}int main() {std::thread t(hello); // 创建线程t.join(); // 等待线程执行完毕return 0;
}
t.join()
:阻塞主线程,等待 t
执行完成,
如果不想等待线程执行完毕,可以使用 detach()
让线程独立运行,detach之后就能够被join
3.2 线程同步
- c++11 互斥锁 std::mutex
最常用的锁,保证线程安全,std::lock_guard<std::mutex> lock(mtx); 使用lock_guard管理锁
- 条件变量 std::condition_variable
常用在生产者消费者场景,与互斥锁联合使用,需要进行循环检查避免虚假唤醒
- 原子操作std::atomic
是一种无锁操作,适用于简单数据保护,如计数器
- c++17 读写锁 std::shared_mutex
用于读多写少的场景,允许多线程共享读锁,独占写锁
- c++20信号量
std::counting_semaphore
用于控制访问资源的线程数量
c++20 std::barrier
多线程分阶段同步,等待所有线程到达同一起点后执行。
持续更新中、、、