



我在即将硕士毕业并面临找工作时非常纠结:选择硬件方向还是软件方向?如果选择软件方向,选择哪种编程语言?由于我在本科和研究生阶段做过信号处理与图像处理等相关工作,加之我个人也喜欢挑战和研究,因此在综合考量后我决定从事与C++相关的软件工作。毕业后,我先在百度从事C++相关工作,随后在字节跳动负责基础架构相关的工作,目前在小米从事虚拟机相关的工作。我一直在C++的学习与实践中持续精进。
C++是一门多范式编程语言。结合个人学习与实践经验,我将C++技术体系划分为以下部分。
● C++基础知识。该部分我推荐的学习材料为《C++ Primer Plus(第6版)中文版》和《C++ Primer 中文版(第 5 版)》,前者适合零基础入门,后者讲解得更深入一些。
● C++模板编程。该部分主要包括标准模板库(Standard Template Library,STL)和模板元编程的相关概念,主要的学习材料为 C++ Templates: The Complete Guide , 2nd Edition (中文版为《C++ Templates(第2版)中文版》)。
● C++并发编程。该部分主要包括使用现代C++进行多线程编程的相关概念,主要的学习材料为 C++ Concurrency in Action, 2nd Edition (中文版为《C++并发编程实战(第2版)》)。
● C++对象模型。该部分主要包括C++中多态的实现原理、对象的内存布局等相关概念,主要的学习材料为 Inside the C++ Object Model (中文版为《深度探索C++对象模型》)。
● C++最佳实践。该部分主要包括如何写出可读性强、安全性高、性能好的C++代码,主要的学习材料为 Effective Modern C++ (中文版为《Effective Modern C++(中文版)》)、 Effective C++: 55 Specific Ways to Improve Your Programs and Designs , 3rd Edition (中文版为《Effective C++:改善程序与设计的 55 个具体做法 中文版(第三版))和 C++ Core Guidelines Explained (中文版为《C++ Core Guidelines解析》)。
本书主要讲解C++对象模型。写作本书的契机源自一次项目故障。当时我们在一个库的接口类中增加了一个虚函数接口,并通过静态库的方式将其提供给业务方使用,这导致业务方的程序崩溃,发生了大面积的coredump(在程序发生异常且该异常在进程内部没有被捕获的情况下,操作系统把进程此刻的内存、寄存器状态、运行堆栈等信息转储保存在一个core文件里)。为此,我复习了《深度探索C++对象模型》一书。同时,我还用GDB深入研究了GCC是如何实现C++对象模型的。在实验过程中,我发现GCC所模拟的C++对象模型并不符合《深度探索C++对象模型》中所描述的对象模型。例如,GCC的虚表布局和《深度探索C++对象模型》中所描述的不一致,并且GCC还会生成VTT(Virtual Table Table,虚表列表)。因为我的工作是基于Linux平台进行C++开发,并且日常用到的编译器为GCC和Clang,所以我决定彻底搞清楚运用GCC/Clang实现C++对象模型的原理,这本书便是我的研究成果。
本书分为8章,主要内容如下。
第1章“概述”介绍对象模型的基本概念,如果你有一定的C++基础,可以跳过本章。
第2章“工具”介绍cppinsights和Compiler Explorer这两个用于研究C++代码实现的开源工具,并利用这两个开源工具研究lambda表达式的相关概念。
第3章“数据语义学”主要讲解GCC如何实现C++对象模型中数据成员的布局。
第4章“函数语义学”主要讲解GCC如何实现C++中的多态、如何调用虚函数等。
第5章“构造、析构语义学”主要讲解GCC如何构造和析构C++对象,包括全局对象和静态局部变量的构造等内容。
第6章“异常处理”主要讲解GCC中异常处理的实现,以及进行异常处理的实践准则。
第7章“运行时类型识别”主要讲解运行时类型识别的实现原理,包括dynamic_cast算法的实现。
第8章“Name Mangling规则”主要讲解GCC如何对C++代码中的各个名称进行编码。
本书从实际代码出发,研究GCC是如何实现C++对象模型的,并从汇编层面进行深入探究。在GCC和Clang编译器中,C++对象模型均是基于Itanium C++ ABI实现的,因此GCC中的C++对象模型的实现均可应用于Clang编译器。
本书适合有一定C++基础、有意深入研究C++的工程师学习。我希望本书能真正帮助到你,带你体会C++的乐趣和魅力。由于目前互联网企业中与Linux相关的岗位使用的编译器大多为GCC/Clang,本书有助于相关岗位的读者更好地学习和工作。
本人并非GCC的专业研究者,书中难免存在疏漏,欢迎读者批评指正,我的邮箱是qls315hfut@126.com。
最后,感谢前辈们提供的开源工具cppinsights和Compiler Explorer。这两个工具使我在本书的写作中事半功倍。感谢我的家人对我的理解,尤其是我的爱人钟元杰,正是有了你们的支持,我才能够全身心地投入本书的写作。感谢人民邮电出版社的龚昕岳编辑和武晓燕编辑指导并帮助我完善了这本书。感谢我的好友高栋在百忙之中对本书进行了审阅并提出了很多宝贵的修改意见,促使本书能早日同读者见面。
秦连松