如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么本书正适合你。
作者Lippman参与设计了全世界套C++编译程序cfront,这本书就是一位伟大的C++编译程序设计者向你阐述他如何处理各种explicit(明确出现于C++程序代码中)和implicit(隐藏于程序代码背后)的C++语意。
《深度探索C++对象模型》专注于C++面向对象程序设计的底层机制,包括结构式语意、临时性对象的生成、封装、继承,以及虚拟——虚拟函数和虚拟继承。这《深度探索C++对象模型》让你知道:一旦你能够了解底层实现模型,你的程序代码将获得多么大的效率。Lippman澄清了那些关于C++额外负荷与复杂度的各种错误信息和迷思,但也指出其中某些成本和利益交换确实存在。他阐述了各式各样的实现模型,指出它们的进化之道及其本质因素。书中涵盖了C++对象模型的语意暗示,并指出这个模型是如何影响你的程序的。
本立道生(侯捷 译序)
前言(Stanley B. Lippman)
第0章 导读(译者的话)
第1章 关于对象(Object Lessons)
加上封装后的布局成本(Layout Costs for Adding Encapsulation)
1.1 C++对象模式(The C++ Object Model)
简单对象模型(A Simple Object Model)
表格驱动对象模型(A Table-driven Object Model)
C++对象模型(The C++ Object Model)
对象模型如何影响程序(How the Object Model Effects Programs)
1.2 关键词所带来的差异(A Keyword Distinction)
关键词的困扰
策略性正确的struct(The Politically Correct Struct)
1.3 对象的差异(An Object Distinction)
指针的类型(The Type of a Pointer)
加上多态之后(Adding Polymorphism)
第2章 构造函数语意学(The Semantics of Constructors)
2.1 Default Constructor的构造操作
“带有Default Constructor”的Member Class Object
“带有Default Constructor”的Base Class
“带有一个Virtual Function”的Class
“带有一个Virtual Base Class”的Class
总结
2.2 Copy Constructor的构造操作
Default Memberwise Initialization
Bitwise Copy Semantics(位逐次拷贝)
不要Bitwise Copy Semantics!
重新设定Virtual Table的指针
处理Virtual Base Class Subobject
2.3 程序转化语意学(Program Transformation Semantics)
显式的初始化操作(Explicit Initialization)
参数的初始化(Argument Initialization)
返回值的初始化(Return Value Initialization)
在使用者层面做优化(Optimization at the User Level)
在编译器层面做优化(Optimization at the Compiler Level)
Copy Constructor:要还是不要?
摘要
2.4 成员们的初始化队伍(Member Initialization List)
第3章 Data语意学(The Semantics of Data)
3.1 Data Member的绑定(The Binding of a Data Member)
3.2 Data Member的布局(Data Member Layout)
3.3 Data Member的存取
Static Data Members
Nonstatic Data Members
3.4 “继承”与Data Member
只要继承不要多态(Inheritance without Polymorphism)
加上多态(Adding Polymorphism)
多重继承(Multiple Inheritance)
虚拟继承(Virtual Inheritance)
3.5 对象成员的效率(Object Member Efficiency)
3.6 指向Data Members的指针(Pointer to Data Members)
“指向Members的指针”的效率问题
第4章 Function语意学(The Semantics of Function)
4.1 Member的各种调用方式
Nonstatic Member Functions(非静态成员函数)
Virtual Member Functions(虚拟成员函数)
Static Member Functions(静态成员函数)
4.2 Virtual Member Functions(虚拟成员函数)
多重继承下的Virtual Functions
虚拟继承下的Virtual Functions
4.3 函数的效能
4.4 指向Member Function的指针(Pointer-to-Member Functions)
支持“指向Virtual Member Functions”的指针
在多重继承之下,指向Member Functions的指针
“指向Member Functions之指针”的效率
4.5 Inline Functions
形式参数(Formal Arguments)
局部变量(Local Variables)
第5章 构造、析构、拷贝语意学(Semantics of Construction,
Destruction, and Copy)
纯虚函数的存在(Presence of a Pure Virtual Function)
虚拟规格的存在(Presence of a Virtual Specification)
虚拟规格中const的存在
重新考虑class的声明
5.1 “无继承”情况下的对象构造
抽象数据类型(Abstract Data Type)
为继承做准备
5.2 继承体系下的对象构造
虚拟继承(Virtual Inheritance)
vptr初始化语意学(The Semantics of the vptr Initialization)
5.3 对象复制语意学(Object Copy Semantics)
5.4 对象的效能(Object Efficiency)
5.5 析构语意学(Semantics of Destruction)
第6章 执行期语意学(Runtime Semantics)
6.1 对象的构造和析构(Object Construction and Destruction)
全局对象(Global Objects)
局部静态对象(Local Static Objects)
对象数组(Array of Objects)
Default Constructors和数组
6.2 new和delete运算符
针对数组的new语意
Placement Operator new的语意
6.3 临时性对象(Temporary Objects)
临时性对象的迷思(神话、传说)
第7章 站在对象模型的尖端(On the Cusp of the Object Model)
7.1 Template
Template的“实例化”行为(Template Instantiation)
Template的错误报告(Error Reporting within a Template)
Template中的名称决议法(Name Resolution within a Template)
Member Function的实例化行为(Member Function Instantiation)
7.2 异常处理(Exception Handling)
Exception Handling快速检阅
对Exception Handling的支持
7.3 执行期类型识别(Runtime Type Identification,RTTI)
Type-Safe Downcast(保证安全的向下转换操作)
Type-Safe Dynamic Cast(保证安全的动态转换)
References并不是Pointers
Typeid运算符
7.4 效率有了,弹性呢?
动态共享函数库(Dynamic Shared Libraries)
共享内存(Shared Memory)
Member Function的实例化行为(Member Function Instantiation)对于template的支持,最困难的莫过于template function的实例化(instantiation)。目前的编译器提供了两个策略:一个是编译时期策略,程序代码必须在program text file中备妥可用; 另一个是链接时期策略,有一些meta.compilation工具可以导引编译器的实例化行为(instantiation)。
下面是编译器设计者必须回答的三个主要问题:
1.编译器如何找出函数的定义?
答案之一是包含template program text file,就好像它是一个header文件一样。
Borland编译器就遵循这个策略。另一种方法是要求一个文件命名规则,例如,我们可以要求,在Point.h文件中发现的函数声明,其template program text一定要放置于文件Point.C或Point.cpp中,依此类推。cfront就遵循这个策略。Edison DesignGroup编译器对这两种策略都支持。
2.编译器如何能够只实例化程序中用到的member functions?
解决办法之一就是,根本忽略这项要求,把一个已经实例化的class的所有member functions都产生出来。Borland就是这么做的——虽然它也提供#pragmas让你压制(或实例化)特定实例。另一种策略就是模拟链接操作,检测看看哪一个函数真正需要,然后只为它(们)产生实例。cfront就是这么做的。Edison DesignGroup编译器对这两种策略都支持。
3.编译器如何阻止member definitions在多个.o文件中都被实例化呢?
解决办法之一就是产生多个实例,然后从链接器中提供支持,只留下其中一个实例,其余都忽略。另一个办法就是由使用者来导引“模拟链接阶段”的实例化策略,决定哪些实例(instances)才是所需求的。
目前,不论是编译时期还是链接时期的实例化(instantiation)策略,均存在以下弱点:当template实例被产生出来时,有时候会大量增加编译时间。很显然,这将是template functions第一次实例化时的必要条件。然而当那些函数被非必要地再次实例化,或是当“决定那些函数是否需要再实例化”所花的代价太大时,编译器的表现令人失望!
C++支持template的原始意图可以想见是一个由使用者导引的自动实例化机制(use—directed automatic instantiation mechanism),既不需要使用者的介入,也不需要相同文件有多次的实例化行为。但是这已被证明是非常难以达成的任务,比任何人此刻所能想象的还要难(请参考[S7ROUP94])。ptlink,随着cfront 3.0版所附的原始实例化工具,提供了一个由使用者驱动的自动实例化机制(use—drivenautomatic instantiation mechanism),但它实在太复杂了,即使是久经世故的人也没法一下子了解。
……
评价二 这本书真的不是一本普通的技术书,它更像是一本武林秘籍,里面藏着C++内力的修炼心法。刚开始翻开的时候,我以为只是又一本讲解C++语法的书,但很快我就发现自己错了。作者并没有在表面功夫上多做停留,而是直指C++的灵魂——对象模型。他把那些看似高深的理论,用一种极其通俗易懂的方式讲了出来。比如,他对继承和多态的解释,不再是简单的文字描述,而是通过详细的对象内存布局和函数调用过程来展现,让我瞬间理解了虚函数表(vtable)和运行时类型信息(RTTI)的真正含义。还有关于“this”指针的讲解,我过去只是知道它指向当前对象,但这本书让我明白了它在不同场景下是如何工作的,以及它与成员函数的调用机制之间的紧密联系。我特别喜欢作者那种循序渐进的讲解方式,每深入一层,都会让你对C++有新的认知。读完之后,我感觉自己看待C++代码的眼光都变了,不再是孤立地看一个个函数和类,而是能够从更宏观、更底层的角度去审视它们的设计。这本书给我带来的不仅仅是知识,更是一种对C++工程实践的深刻反思。
评分评价三 这是一本能让你“脱胎换骨”的学习C++的书。我曾经花了很多时间去学习C++的各种语法和特性,但总感觉自己只是在“使用”C++,而不是真正“理解”它。这本书的出现,彻底改变了我的看法。它没有泛泛而谈,而是聚焦于C++对象模型的精髓,从最基础的对象内存布局开始,层层递进,讲解了构造函数、析构函数、拷贝构造函数、赋值运算符重载等核心概念背后的实现原理。尤其令我惊叹的是,作者对于不同类型对象在内存中的表现,以及编译器如何进行优化,都有着非常细致的阐述。我之前对一些“魔法般”的C++行为感到困惑,比如为什么某些拷贝操作比预期的要慢,或者为什么会出现一些看似不合理的内存访问。这本书就像一把钥匙,为我打开了这些谜团的大门。它让我明白了,很多时候,我们编写的代码,最终都会被编译成一系列底层的内存操作和函数调用,而理解这些底层逻辑,对于写出高质量、高性能的C++代码至关重要。这本书的价值,在于它让你从“知其然”上升到“知其所以然”,从而真正掌握C++这门语言。
评分评价四 对于像我这样,在C++领域摸爬滚打多年的开发者来说,想要在技术上更进一步,往往需要一些能够“点石成金”的指引。这本书恰恰就是这样的存在。它没有停留在教你如何写某个特定的语法,而是深入到C++对象模型的底层机制。作者的讲解方式非常有条理,从对象的诞生(构造)到消亡(析构),从数据的存储到行为的实现,都做了详尽的剖析。特别是对于继承和组合的深入探讨,它不仅仅是罗列概念,而是通过分析对象在内存中的结构,以及成员函数的调用流程,来解释它们是如何在运行时工作的。我以前对多态的理解,仅停留在虚函数上,但这本书让我明白了虚函数表(vtable)的运作原理,以及它是如何实现多态性的。而且,作者还提到了不同编译器在实现这些机制时的差异,这对于编写跨平台、高性能的代码非常有帮助。我感觉这本书就像是一张C++对象模型的“藏宝图”,指引我发现了那些隐藏在代码之下的宝藏。它不仅提升了我对C++的理解深度,更重要的是,它激发了我对如何更优雅、更高效地使用C++的思考。
评分评价五 这本书是一次令人惊叹的C++对象模型探索之旅。我一直对C++的底层运行机制充满好奇,而这本书恰好满足了我的求知欲。作者以极其清晰的逻辑,将C++对象模型的复杂性抽丝剥茧般地呈现出来。我印象最深刻的是,他对不同函数调用约定(calling conventions)的讲解,以及它们如何影响函数参数的传递和栈帧的构建,这让我对函数调用的实际过程有了更深入的理解。此外,书中关于内存模型、对齐原则、以及编译器优化对对象布局的影响,都进行了详细的阐述。我曾经在调试一些内存相关的bug时感到束手无策,但读了这本书之后,我开始能够通过分析对象的内存布局,来推断出问题的根源。作者的写作风格严谨而不失生动,他善于用形象的比喻和精炼的代码片段来解释抽象的概念,使得学习过程不再枯燥。读这本书,感觉就像是在和一位经验丰富的C++专家进行深度交流,你不仅能学到知识,更能获得一种解决问题的思路和方法。它让我对C++这门语言的敬畏之心油然而生,同时也让我对未来如何写出更高质量的代码充满了信心。
评分评价一 这本书简直把我对C++的理解颠覆了,尤其是在对象模型这一块。过去我总觉得C++的对象模型是个黑箱,虽然能用,但总觉得抓不住核心。读完这本书,我才恍然大悟,原来它背后的机制是如此的精巧和高效。作者通过大量的图示和代码示例,将那些抽象的概念一一具象化,让我不再畏惧虚函数、多重继承、模板元编程这些曾经让我头疼的玩意儿。特别是关于对象布局、内存分配、以及不同编译器如何实现这些特性时,我仿佛看到了C++语言在底层是如何运作的。最让我印象深刻的是,它并没有仅仅停留在“是什么”的层面,而是深入到“为什么”和“怎么做”,引导读者去思考如何写出更优美、更高效、更符合C++设计哲学的代码。读这本书的过程,就像是在玩一个精妙的机械装置,每解开一个齿轮,都能体会到设计的智慧。我之前在工作中遇到的很多性能瓶颈和难以调试的问题,在这本书的启发下,都有了新的解决思路。强烈推荐给所有想要深入理解C++,并且希望将技术推向更高层次的开发者。
评分更好地理解编译、运行过程中的内存管理
评分经典书籍,c++必读系列,加油^0^~
评分《C和C++经典著作:C陷阱与缺陷》适合有一定经验的C程序员阅读学习,即便你是C编程高手,《C和C++经典著作:C陷阱与缺陷》也应该成为你的案头必备书籍。作者以自己1985年在Bell实验室时发表的一篇论文为基础,结合自己的工作经验扩展成为这本对C程序员具有珍贵价值的经典著作。写作《C和C++经典著作:C陷阱与缺陷》的出发点不是要批判C语言,而是要帮助C程序员绕过编程过程中的陷阱和障碍。《C和C++经典著作:C陷阱与缺陷》分为8章,分别从词法分析、语法语义、连接、库函数、预处理器、可移植性缺陷等几个方面分析了C编程中可能遇到的问题。结尾,作者用一章的篇幅给出了若干具有实用价值的建议。
评分书本讲的还可以…继续学习!加油!!!。
评分C++领域非常重要的一本书。以前cpp入门是读stroustrup的the cpp programming language,感觉回过头来读cpp primer依然有许多收获。对c11的介绍很好,在工程上这些新技术也很实用。
评分稍微有点不足的地方是,全书很多地方有跳跃性,一些概念往往是在前几章给出个大致,在后续部分才完全讲解
评分跟你交易次次都这么成功和开心的..希望我们以后有更多的交易吧...哈哈
评分不错,支持买书还是正品,哈哈
评分书很不错,印刷很好,质量很棒。
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 book.cndgn.com All Rights Reserved. 新城书站 版权所有