公司动态
cracking-the-coding-interview第12章C与C++10题精讲:虚函数、浅拷贝vs深拷贝、volatile——C++面试核心考点一网打尽
cracking-the-coding-interview第12章C与C10题精讲虚函数、浅拷贝vs深拷贝、volatile——C面试核心考点一网打尽【免费下载链接】cracking-the-coding-interview:books: C and Python solutions with automated tests for Cracking the Coding Interview 6th Edition.项目地址: https://gitcode.com/gh_mirrors/cra/cracking-the-coding-interviewcracking-the-coding-interview是一个高完成度的开源刷题项目它用C 与 Python 双语言实现了《Cracking the Coding Interview代码面试权威指南第6版》中 139 道题的解法并为每一道题都配备了自动化单元测试C 用 Catch 框架Python 用 unittest通过持续集成保证代码活着——这是它区别于普通题解仓库的最大卖点。本章聚焦全书第 12 章C 与 C 语言基础共 10 道题覆盖了虚函数、浅拷贝 vs 深拷贝、volatile、智能指针、内存对齐等 C 面试最高频的考点 。每一题的完整讨论都写在对应的头文件注释中读一遍注释就等于听了一堂面试冲刺课。一分钟上手如何编译与运行全部测试在 Linux / Mac 环境下克隆仓库后一条命令即可完成配置与测试git clone https://gitcode.com/gh_mirrors/cra/cracking-the-coding-interview ctci cd ctci make configure-ubuntu # Mac 用户执行 make configure-mac make test # 一键运行全部 Python C 单元测试第12章的所有测试入口统一在根目录的tests.cpp中make test通过后说明 10 道题全部可用。相关入口文件统一测试入口tests.cpp章节头文件组织本章各题头文件cpp_solutions/chapter_12_cpp/chapter_12_includes.h测试数据文件cpp_solutions/chapter_12_cpp/problem_12_01_data_1.txt等 3 个 txt第12章10道题全景图考点速查表#题目核心考点实现文件1读取文件最后 K 行循环链表、O(1) 额外空间problem_12_01_lastKLines.h2原地反转字符串指针操作problem_12_02_reverse.h3哈希表 vs STL map哈希冲突、红黑树problem_12_03_hashTable.h4虚函数是如何工作的vtable / vptr、动态绑定problem_12_04_virtualFunctions.h5浅拷贝 vs 深拷贝指针复制语义problem_12_05_shallowVsDeepCopy.h6volatile 关键字的意义编译器优化、内存映射 I/Oproblem_12_06_volatile.h7基类析构函数为何要 virtual内存泄漏、动态派发析构problem_12_07_virtualBaseClass.h8深拷贝含指针的节点递归、深拷贝problem_12_08_copyNode.h9实现引用计数智能指针拷贝构造/赋值、RAIIproblem_12_09_smartPointer.h10编写对齐版 malloc/free内存对齐、位运算problem_12_10_alignedMalloc.h文件均位于cpp_solutions/chapter_12_cpp/目录下。每道纯概念题第 3~7、9 题以详尽的英文 DISCUSSION 注释形式存在而带算法的题第 1、2、8、10 题则是真实可编译、可测试的 C 实现注释中同步写明时间/空间复杂度。三大高频概念题精讲面试官最爱问的三连问1️⃣ 虚函数是如何工作的problem_12_04这是 C 多态的灵魂问题。项目注释problem_12_04_virtualFunctions.h给出了一条清晰的回答链路vptr / vtable 机制每个含虚函数的对象都携带一个隐藏的虚表指针vptr指向本类唯一的虚表vtable虚表中的每个槽位存的是该类最终版本函数的地址。动态绑定 vs 静态绑定非虚函数在编译期就绑定静态绑定虚函数则在运行期通过 vptr 查表动态绑定。代价意识C 默认选择静态绑定是为了性能——每个对象多一个指针、每次虚调用多一次查表。答出性能权衡是加分项 ✅2️⃣ 浅拷贝 vs 深拷贝区别与各自适用场景problem_12_05problem_12_05_shallowVsDeepCopy.h把这道经典题讲得格外到位浅拷贝只复制成员变量本身。若成员是指针两个对象将指向同一块堆内存——通常不是期望行为容易引发逻辑错误或内存访问异常。但它也有用武之地对大块只读不变的数据如一张大图像传递 const 指针给多个处理函数无需复制数据本身。深拷贝递归进入所有被指向的内存重新分配并逐字节拷贝得到完全独立的副本适合不同代码段要各自修改同一份数据的场景。 面试技巧先说定义再说各自典型场景最后补一句深拷贝通常由拷贝构造函数实现即完整闭环。3️⃣ volatile 关键字到底解决什么问题problem_12_06problem_12_06_volatile.h的回答抓住两个得分点volatile 告知编译器该变量可能在当前代码块之外被修改典型场景硬件、内存映射 I/O从而禁止基于变量不变假设做的优化如把变量缓存进寄存器否则会读到过期值导致未定义行为。高频加分项C11 中 volatile 不用于多线程同步线程间通信应使用std::atomicT——这条几乎必问。内存与对象生命周期4 道进阶杀手题基类析构函数为什么要声明为 virtual场景Person* p new Student();后delete p;。若基类析构非虚运行时只会调用Person的析构函数Student部分分配的内存永远不会释放造成内存泄漏甚至内存损坏详见problem_12_07_virtualBaseClass.h。一句话结论只要基类会被多态 delete析构函数必须 virtual。深拷贝一个含指针的节点结构problem_12_08problem_12_08_copyNode.h用递归给出 O(N) 解法每访问一个节点就 new 一个新节点并对下一个节点递归调用——一行核心代码new Node(target-getValue(), copyNode(target-getNext()))完成整棵结构的独立复制。注释中还点明若节点有两个子指针只需多一行递归即可体现可扩展的工程思维。手写一个引用计数智能指针problem_12_09problem_12_09_smartPointer.h是一个可直接编译运行的模板实现完整展示了智能指针的全部关键时机成员指向对象本身T* _obj指向引用计数器的指针size_t* _referenceCount两个都必须是指针保证全局只有一份对象和一份计数构造 → 计数初始化拷贝构造/赋值 → 计数 1析构 → 计数 -1归零时delete对象与计数器时间/空间复杂度均为O(1)。这道题本质是在手写简化版shared_ptr是理解 C11 智能指针的绝佳跳板。对齐版 malloc让 CPU 一次读完数据problem_12_10problem_12_10_alignedMalloc.h解释了对齐的意义CPU 按内存访问粒度一次性读取多个字节若 32 位数据横跨两个读取单元就需要两次读取指令对齐后一次完成。实现思路也很巧妙多分配alignment - 1 sizeof(void*)字节保证一定框住一个对齐地址用位运算(addr offset) ~(alignment - 1)向下取整到对齐地址在对齐地址前一个指针位置偷藏原始malloc指针alignedFree时取回释放保证内存可回收。这是位运算 系统底层结合的典范题面试中答出偷藏指针这一步基本满分 算法实战 3 题文件流、指针与哈希读取文件最后 K 行O(1) 空间解法problem_12_01problem_12_01_lastKLines.h的解法很漂亮建一个K 个节点的循环链表逐行读文件并覆盖最老的一行全程只保留最后 K 行——时间 O(N)、空间 O(1)。它还妥善处理了空文件、行数少于 K 两个边界情况测试用 3 个数据文件自动验证文件缺失即失败。原地反转字符串problem_12_02problem_12_02_reverse.h/problem_12_02_reverse.cpp是最纯粹的指针双端对调练习头尾两个指针向中间逼近、逐字符交换直到相遇停止。看似简单却是手写实现类题目的基本功。哈希表 vs std::map一道对比实现原理复合题problem_12_03problem_12_03_hashTable.h的讨论覆盖四个层次哈希函数把 key 映射为数组下标冲突不可避免C11 提供std::hash模板作为默认实现表结构数组 链表冲突的 key 挂到链表尾部 → 查找均摊 O(1)最坏 O(N)扩容容量耗尽需整体迁移不能太频繁小数据量替代方案key 可比较大小时用二叉搜索树std::map正是红黑树每节点多一个红/黑色位保证近似平衡查找 O(log N)。如何把这一章变成你的面试冲刺清单先读注释后写代码第 4~7、9 题的 DISCUSSION 注释本身就是标准答案通读三遍即可内化跑一遍测试验证理解make test全绿后挑lastKLines、alignedMalloc两道算法题合上代码自己重写串联记忆把 10 题按多态12_04/12_07→ 拷贝语义12_05/12_08/12_09→ 底层12_06/12_10→ 数据结构12_03四条主线复习覆盖 C 面试约 70% 的语言基础题想扩展项目 Python 解法集中在python_solutions/各章节目录C 侧第 12 章目前完成 10/11剩余题目正是可以贡献 PR 的机会。全部代码遵循 MIT 风格开源协议见仓库LICENSE可自由学习与商用。【免费下载链接】cracking-the-coding-interview:books: C and Python solutions with automated tests for Cracking the Coding Interview 6th Edition.项目地址: https://gitcode.com/gh_mirrors/cra/cracking-the-coding-interview创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考