深度探索C++对象模型

[美] Stanley B. Lippman

出版时间

2012-01-01

ISBN

9787121149528

评分

★★★★★
书籍介绍
这不是一本教你怎么写C++的书,而是带你钻进编译器内部,看它在你看不见的地方悄悄做了什么。书中反复出现一个令人不安的真相:许多代码'能正确编译、能顺利执行',效率却惨不忍睹;某些操作甚至'既未被构造,也未被析构',悄悄埋下未初始化对象的隐患。作者Lippman作为cfront编译器的设计者,把'显式写出的'与'隐式发生的'之间的落差逐一摊开——临时对象为何层层嵌套、为何必须用初始化列表、virtual出现时为何处处特例。读者最深刻的反馈恰恰是:读完之后写代码会'多从语意层面思考',理解每个设计背后的目的与代价。它适合那些不满足于'能跑就行'、想真正读懂C++面向对象底层机制的人;也有人吐槽它翻译生硬、'宜通读不宜细读'——但正是这份'蛋疼',让它成为理解C++实现本质的不可替代之作。
作者简介
Stanley B. Lippman 是微软公司 Visual C++ 团队的架构师。他从1984年开始在贝尔实验室与 C++ 的设计者 Bjarne Stroustrup 一起从事 C++ 的设计与开发。他还著有 Inside the C++ Object Model。
AI导读
核心看点
  • 由C++编译器设计者撰写,揭示对象底层实现机制
  • 深入解析封装、继承、多态及临时对象的语意与成本
  • 澄清C++性能迷思,帮助编写高效且符合标准的代码
读者共识
  • C++进阶必读经典,读完对语言设计有恍然大悟之感
  • 翻译质量参差不齐,部分术语晦涩,建议对照原文
  • 虽内容稍显陈旧且枯燥,但仍是理解OO本质的佳作
精彩摘录
  • "在这四种情况中,程序可以被正确编译并执行,但是效率不彰。"
  • "You mustuse the member initialization list in the following cases in order for your program to compile 1. When initializing a reference member 2. When initializing a const member 3. When invoking a base or member class constructor with a set of arguments In the fourth case, the program compiles and "
  • "1. b[i] + c[i] 对应一个 2. b[i] * c[i] 对应一个 3. 上述两个临时对象的相减结果需要一个来存放 4. 两个临时对象,分别用来放置上述第一个临时对象和第二个临时对象,为的是完成第三个临时对象"
  • "RIIT 就是为了 EH (Exception Handling) 的副产物"
  • "然而如果企图以一个RedPanda object作为little_critter的初值,编译器必须判断“后续当程序员企图存取其ZooAnimal subobject时是否能够正确地执行”(这是一个理性的程序员所期望的)"
  • "foobar()函数中的L5,有个 Point object local,同样也是既没有被构造也没有被析构。当然啦,Point object local如果没有先经过初始化,可能会成为一个潜在的程序“臭虫”——万一第一次使用它就需要其初值的话(像L7)。至于 heap object在L6的初始化操作: 6)Point * heap = new Point; 会被转为对new运算符(由library提供)的调用: Point *heap = __new( sizeof( Point ) ); 再一次强调一下,并没有 default constructor施行于new运算符所传过的Point身上。"
目录
本立道生(侯捷 译序) III
前言(Stanley B. Lippman) XIII
第0章 导读(译者的话) XXV
第1章 关于对象(Object Lessons) 1
加上封装后的布局成本(Layout Costs for Adding Encapsulation) 5

显示全部
用户评论
对于了解C++对象模型的底层实现,理清C++在实现OO的机制,很有帮助。
面试必备
按简介读了1, 3, 4章. 学到的东西足够应付面试了. 书里讲了很多编译器底层的内容, 可惜实在晦涩难懂, 一方面是这些内容本身高深, 另一方面作者笔力也属实不够. 这本书已经出版20多年, 希望未来能有更现代且更易懂的书推出
写作风格非常奇怪 以及小错误非常多 造成了理解上的困难
大体还算流畅,比如说从最简单的布局/语义入手,然后一步步加继承、多态、多重继承、虚拟继承,或是加全局、静态。不过很多地方推动的还是不自然,比如说为什么要有dynamic_cast, 为什么要有distinction。 另外作者是完全不更新了吗,这么多年C++增加了好多内容,好歹也写下move semantics吧。lol anyway,整体上学了很多知识,知道了更多“当代码跑起来,实际发生了什么”。
理解C++对象模型必看的一本书。推荐用 C++ Insight/编译器打印内存布局的 flag 跑书中的代码,好形成直观的理解。P.S. 有些地方还是看得半懂不懂,以后再看。
目前对c++的使用还太少,对编译链接等等的了解也不深,所以书中好多内容不明白,日后应该会再读
受益匪浅,值得反复阅读。不过有门槛,不建议初学者硬读。
快速翻完了前五章,对于C++对象构造拷贝和析构,对象的成员变量访问和函数调用过程有了更深的理解,第二章和第四章是精华。
下载
收藏