深圳斯马顿电气有限公司 C++ 软件开发 一面 面经
1. 进程和线程的本质区别是什么?它们在资源分配和调度上有何不同?
参考答案:进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位。主要区别包括:
- 资源开销:进程拥有独立的地址空间、文件描述符等资源,创建和切换开销大;线程共享进程资源,开销小
- 通信方式:进程间通信需要IPC机制(管道、消息队列、共享内存等);线程可直接访问共享变量
- 独立性:进程间相互独立,一个进程崩溃不影响其他进程;同一进程内的线程共享资源,一个线程崩溃可能导致整个进程终止
- 地址空间:每个进程有独立的虚拟地址空间;同一进程的线程共享地址空间
2. 虚函数的实现机制是什么?虚函数表存储在哪里?
参考答案:虚函数通过虚函数表(vtable)和虚函数指针(vptr)实现多态:
- 每个包含虚函数的类都有一个虚函数表,存储该类所有虚函数的地址
- 每个对象实例包含一个虚函数指针,指向其类的虚函数表
- 虚函数表通常存储在只读数据段(.rodata),虚函数指针存储在对象内存的起始位置
- 调用虚函数时,通过对象的vptr找到vtable,再根据函数索引找到实际函数地址
- 派生类会继承基类的vtable,并覆盖被重写的虚函数地址
3. 解释C++中的左值和右值,以及移动语义的作用
参考答案:
- 左值(lvalue):有明确内存地址、可以取地址的表达式,如变量名、解引用指针等
- 右值(rvalue):临时对象或字面量,没有持久的内存地址,如函数返回的临时对象、算术表达式结果
- 移动语义通过右值引用(&&)实现资源的转移而非拷贝: 避免深拷贝开销,直接"窃取"临时对象的资源移动构造函数和移动赋值运算符接受右值引用参数std::move可将左值转换为右值引用,显式触发移动语义
- 典型应用场景:容器元素的插入、返回
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++八股文全集 文章被收录于专栏
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。
查看12道真题和解析