深度探索C++对象模型的读书心得

参考:深度探索C++对象模型 (stanley B.Lippman著 侯捷翻译)

1. Page9 : C++对象模型,说明每一个类仅有一个虚函数表Vtbl,而类的每一个对象都有指向其表的指针。

2. Page30:引用也需要与一个指针(大小为4BYTE)相同的空间。

3. Page28: 指针类型会教导编译器如何解释某个特定地址中的内存内容及大小。

4. Page39: explicit关键字能够制止“单一参数的constructor被当做一个Conversion运算符”

5. Page42: 被合成的default constructor只满足编译器的需要,而不是程序的需要。

6. Page53: 当一个类不展现bitwiste copy semantics(位逐次拷贝)需要编译器合成一个。

7. Page74:NRV(Name return value)也即是函数有返回值,其可以用在参数列表中多加一个参数来进行优化。

8. Page88:即使一个类class没有任何object实体,其static data memebers也已经存在。

9. Page92:只有含有virtual函数的类的对象,才有vptr指针。

10.Page95:每一个member的存取许可(private/public/protected),以及与class的关联,并不会导致任何空间上或执行时间上的额外负担------不论是在个别

的class objects或是在static data member本身。

11.Page97: name-mangling名字改编,名字重整

12.Page102:C++语言保证”出现在derived class中的base class subobject有其完整原样性“。

13.Page113:多重继承的问题主要发生于derived class objects和其第二或后继的base class objects之间的转换。

14.Page145:如果声明extern ”c” 会压抑non member fuction的“mangling”效果。

15.Page153:在C++中,多态表示“以一个public base class的指针(或引用)寻址出一个derived class object”的意思。

16.Page164:在多重继承之下,一个derived class内含n-1个额外的virtual tables(也就是其共有n个虚表),n表示其上一层的base classes的数目,因此

单一继承将不会有额外的virtual tables。

在学习C++对象模型的时候,我们主要学习编译器在背后为我们做了什么?如何做的?为什么这么做?(其主要还是为了时间、空间的效率以及与C的兼容性来考虑的)。

深度探索C++对象模型的读书心得,布布扣,bubuko.com

时间: 2024-10-15 11:43:00

深度探索C++对象模型的读书心得的相关文章

[转]《深度探索C++对象模型》读书笔记[一]

前 言 Stanley B.Lippman1.   任何对象模型都需要的三种转换风味: ü        与编译器息息相关的转换 ü        语言语义转换 ü        程序代码和对象模型的转换 2.   C++对象模型的两种解释 ü        语言中直接支持面向对象程序设计的部分 ü        对于各种支持的底层实现机制 3.   C++ class的完整virtual functions在编译时期就固定下来了,程序员没有办法在执行期动态增加或取代其中某一个.这使得虚拟函数调

[转]《深度探索C++对象模型》读书笔记[二]

3.3 Data Member的存取1.   不管什么情况,每一个static data member只有一个实体,放在程序的data segment之中,每次程序取用static member,不管是通过operator::还是member selection operator,都会被内部转化为对该唯一extern实体的直接参考操作.每一个static member的存取以及与class的关联不会导致任何执行时间或空间上的额外负担.如果有两个classes,每一个都声明了一个static me

[读书系列] 深度探索C++对象模型 初读

2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio之类的工具的话,写C++代码感觉要比较费劲,最近重读了这本书后,感觉要写点东西下来(因为懒得用笔作笔记,太慢了-_-!)加深下印象. 以前还是新手的时候,总是认为: 1.class如果没有定义任何constructor的话,编译器会自动合成一个default constructor(我习惯叫缺省的构造函数)出

【深度探索C++对象模型】第二章 构造函数语意学(上)

第二章 构造函数语意学(The Semantics of Constructors) -- 本书作者:Stanley B.Lippman 一.前言 首先让我们来梳理一个概念: 默认构造函数(Default Constructor) : 是在没有显示提供初始化式时调用的构造函数.它由不带任何参数的构造函数,或是为所有形参提供默认实参的构造函数定义.如果定义的某个类的成员变量没有提供显示的初始化式时,就会调用默认构造函数(Default Contructor). 如果用户的类里面,没有显示的定义任何

《深度探索c++对象模型》chapter1关于对象对象模型

在c++中,有2种class data member:static和nostatic,以及3钟class member function:static,nostatic和virtual.已知下面这个class Point声明: class Point { public: Point(float xval); virtual ~Point(); float x() const; static int PointCount(); protected: virtual ostream& print(o

柔性数组-读《深度探索C++对象模型》有感 (转载)

最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下: 例如,把单一元素的数组放在一个struct的尾端,于是每个struct objects可以拥有可变大小的数组.    code: struct mumble { //stuff char pc[1];    };        //从档案或标准输入装置中取得一个字符串,然后为struct本身和该字符串配置

【深度探索C++对象模型】第一章 关于对象

第一章 关于对象(Object Lessons) -- 本书作者:Stanley B.Lippman 一.前言 什么是 C++ 对象模型:简单的说,就是 C++ 中面向对象的底层实现机制. 本书组织: 第 1 章,关于对象(Object Lessons),介绍 C++ 对象的基础概念,给读者一个粗略的了解. 第 2 章,构造函数语意学(The Semantics of Constructors),构造函数什么时候会被编译器合成?它给我们的程序效率带来了怎样的影响? 第 3 章,Data语意学(T

深度探索C++对象模型第6章 执行期语意学

(一)对象的构造和析构(Object Construction and Destruction) 一般而言我们会把object尽可能放置在使用它的那个程序区段附近,这么做可以节省非必要的对象产生操作和摧毁操作. 全局对象 如果我们有以下程序片段: Matrix identity main() { //identity 必须在此处被初始化 Matrix m1=identity; ... return 0; } C++保证,一定会在main()函数中第一次用到identity之前,把identity

【深度探索c++对象模型】Function语义学之虚函数

虚函数的一般实现模型:每一个class有一个virtual table,内含该class之中有作用的virtual function的地址,然后每个object有一个vptr,指向virtual table. 识别class是否支持多态,唯一恰当的方法是看它是否有virtual function,只要class拥有virtual function,它就需要额外的执行期信息. 考虑ptr->z(),ptr是基类指针,z是虚函数,为了找到并调用z()的适当实体,我们需要两项信息: 1.ptr所指对象