读书笔记《深入理解C++对象模型》
来源:互联网 发布:手机qq游戏大厅mac版 编辑:程序博客网 时间:2024/05/31 11:03
1.1
1. C++对象模式
(1)简单对象模型:在这个简单模型中,一个object是一系列的slots,每一个slot指向一个members,Members按其生命次序,各被指定一个slot,每一个data member或者function member都有自己的一个slot
(2)表格驱动对象模型:把所有与members相关的信息抽出来,放在一个data member table和一个member function table之中,class object本身则内含指向这两个表格的指针,Member function table是一系列的slots,每一个slot指出一个member fuction;Data member table则直接含有data本身
(3)C++对象模型:在此模型中,Nonstatic data members被配置于每一个class object之内,static data members则被存放在所有的class object之外,Static和nonstatic function members也被放在所有的class object之外,Virtual functions则以两个步骤支持之:
1.每一个class产生一堆指向vitual functions的指针,放在表格之中,这个表格被称为virtual table
2.每一个class object被添加了一个指针,指向相关的virtual table,通常这个指针被称为vptr,vptr的设定和重置都由每一个class的constructor,destructor和copy assignment运算符自动完成,每一个class所关联的yupe_info object也经由virtual table被指出来,通常是放在表格的第一个slot处。
1.2 关键词所带来的差异
组合(composition),而非继承,才是把C和C++结合在一起的唯一可行方法。
1.3 对象的差异
1. 需要多少内存才能表现一个class object? 一般而言要有:
(1)其nonstatic data members的总和大小;
(2)加上任何由于alignment的需求而填补上去的空间(可能存在于members之间,也可能存在于集合体边界)
(3)加上为了支持virtual而由内部产生的任何额外负担(overhead)
2.C++通过class的pointers和references来支持多态,这种程序设计风格就称为"面向对象"
第二章 构造函数语意学
1.重新设定Virtual Table的指针
回忆编译期间的两个程序扩张操作(只要有一个class声明了一个或多个virtual functions就会如此):
增加一个virtual function table(vtbl),内含每一个有作用的virtual function的地址。
将一个指向virtual function table的指针(vptr),安插在每一个class object内。
2.ptr的多态机能主要扮演一个输送机制(transport mechanism)的角色,经由它,我们可以在程序的任何地方采用一组public derived类型。这种多态形式被称为是消极的,可以在编译时期完成--virtual base class 的情况除外。
当被指出的对象真正被使用时,多态也就变成积极(active)的了。
3.由于没有导入如plymorphic之类的新关键词,因此识别一个class是否支持多态,唯一适当的方法就是看看它是否有任何virtual function,只要class拥有一个virtual function,它就需要这份额外的执行期信息。
4.为了找到表格,每一个class object被安插上一个由编译器内部产生的指针,指向该表格。
为了找到函数地址,每一个virtual function被指派一个表格索引值。
这些工作都是由编译器完成,执行期要做的,只是在特定的virtual table slot中激活virtual functon
一个class 只会有一个vitual table,每一个table内含其对应的class object 中所有active virtual functions函数实体的地址。
5.<font color="#000000">不要在一个virtual base class中声明nonstatic data members.</font>
6.注意下面的程序片段:
float (Point::*pmf)() = &Point::z;
Point *ptr = new Point3d;
如果我们从pmf间接调用z()呢?(ptr->*pmf)();仍然是Point3d::z()被调用。
对于一个nonstatic member function取其地址,将获得该函数在内存中的地址。然而对于一个virtual function取其地址,所能获得只是一个索引值。
7.inline函数对于封装提供了一种必要的支持,可以有效存取封装于class中的nonpublic数据,它同时也是C程序中大量使用的#define(前置处理宏)的一个安全代替品--特别是如果宏中的参数有副作用的话,然而一个inline函数如果被调用太多次的话,会产生大量的扩展码,使程序的大小暴涨。
第四章 构造、解构、拷贝语意学
1.不要把virtual destructor声明为pure
2.一般而言,把所有的成员函数都声明为virtual function ,然后再靠编译器的优化操作把非必要的virtual invocation去除,并不是好的设计观念。
3.new 运算符实际上总是以标准的C malloc()完成,虽然并没有规定移动得这么做不可,相同的情况,delete运算符也总是以标准的C free()完成;
extern void
operator delete(void* ptr)
{
if(ptr)
{
free((char*)ptr);
}
}
1. C++对象模式
(1)简单对象模型:在这个简单模型中,一个object是一系列的slots,每一个slot指向一个members,Members按其生命次序,各被指定一个slot,每一个data member或者function member都有自己的一个slot
(2)表格驱动对象模型:把所有与members相关的信息抽出来,放在一个data member table和一个member function table之中,class object本身则内含指向这两个表格的指针,Member function table是一系列的slots,每一个slot指出一个member fuction;Data member table则直接含有data本身
(3)C++对象模型:在此模型中,Nonstatic data members被配置于每一个class object之内,static data members则被存放在所有的class object之外,Static和nonstatic function members也被放在所有的class object之外,Virtual functions则以两个步骤支持之:
1.每一个class产生一堆指向vitual functions的指针,放在表格之中,这个表格被称为virtual table
2.每一个class object被添加了一个指针,指向相关的virtual table,通常这个指针被称为vptr,vptr的设定和重置都由每一个class的constructor,destructor和copy assignment运算符自动完成,每一个class所关联的yupe_info object也经由virtual table被指出来,通常是放在表格的第一个slot处。
1.2 关键词所带来的差异
组合(composition),而非继承,才是把C和C++结合在一起的唯一可行方法。
1.3 对象的差异
1. 需要多少内存才能表现一个class object? 一般而言要有:
(1)其nonstatic data members的总和大小;
(2)加上任何由于alignment的需求而填补上去的空间(可能存在于members之间,也可能存在于集合体边界)
(3)加上为了支持virtual而由内部产生的任何额外负担(overhead)
2.C++通过class的pointers和references来支持多态,这种程序设计风格就称为"面向对象"
第二章 构造函数语意学
1.重新设定Virtual Table的指针
回忆编译期间的两个程序扩张操作(只要有一个class声明了一个或多个virtual functions就会如此):
增加一个virtual function table(vtbl),内含每一个有作用的virtual function的地址。
将一个指向virtual function table的指针(vptr),安插在每一个class object内。
2.ptr的多态机能主要扮演一个输送机制(transport mechanism)的角色,经由它,我们可以在程序的任何地方采用一组public derived类型。这种多态形式被称为是消极的,可以在编译时期完成--virtual base class 的情况除外。
当被指出的对象真正被使用时,多态也就变成积极(active)的了。
3.由于没有导入如plymorphic之类的新关键词,因此识别一个class是否支持多态,唯一适当的方法就是看看它是否有任何virtual function,只要class拥有一个virtual function,它就需要这份额外的执行期信息。
4.为了找到表格,每一个class object被安插上一个由编译器内部产生的指针,指向该表格。
为了找到函数地址,每一个virtual function被指派一个表格索引值。
这些工作都是由编译器完成,执行期要做的,只是在特定的virtual table slot中激活virtual functon
一个class 只会有一个vitual table,每一个table内含其对应的class object 中所有active virtual functions函数实体的地址。
5.<font color="#000000">不要在一个virtual base class中声明nonstatic data members.</font>
6.注意下面的程序片段:
float (Point::*pmf)() = &Point::z;
Point *ptr = new Point3d;
如果我们从pmf间接调用z()呢?(ptr->*pmf)();仍然是Point3d::z()被调用。
对于一个nonstatic member function取其地址,将获得该函数在内存中的地址。然而对于一个virtual function取其地址,所能获得只是一个索引值。
7.inline函数对于封装提供了一种必要的支持,可以有效存取封装于class中的nonpublic数据,它同时也是C程序中大量使用的#define(前置处理宏)的一个安全代替品--特别是如果宏中的参数有副作用的话,然而一个inline函数如果被调用太多次的话,会产生大量的扩展码,使程序的大小暴涨。
第四章 构造、解构、拷贝语意学
1.不要把virtual destructor声明为pure
2.一般而言,把所有的成员函数都声明为virtual function ,然后再靠编译器的优化操作把非必要的virtual invocation去除,并不是好的设计观念。
3.new 运算符实际上总是以标准的C malloc()完成,虽然并没有规定移动得这么做不可,相同的情况,delete运算符也总是以标准的C free()完成;
extern void
operator delete(void* ptr)
{
if(ptr)
{
free((char*)ptr);
}
}
0 0
- 《深入理解c++对象内存模型》读书笔记
- 读书笔记《深入理解C++对象模型》
- 《深入理解C++对象模型》读书笔记(一)
- 《深入理解C++对象模型》读书笔记(二)
- 深入探索C++对象模型读书笔记
- 深入探索C++对象模型 读书笔记
- 读书笔记-《深入理解Java虚拟机》-对象探秘
- 深度理解C++对象模型读书笔记——对象模型
- 【读书笔记】《深入理解c#》(1)
- 《C# in Depth:深入理解C#》读书笔记 - 隐式类型、对象初始化程序和匿名类型
- 学习《深入理解C++对象模型》小结
- 学习《深入理解C++对象模型》小结
- 深入理解C#的对象模型
- 深入理解JavaScript的对象模型
- [读书笔记] 深入探索C++对象模型-第一章《关于对象》
- 深入C++对象模型读书笔记(一、关于对象)
- 读书笔记-《深入理解Java虚拟机》-JVM内存模型
- 深入探索C++对象模型 读书笔记(1)
- 树莓派 打开串口调试工具xgcom的方法
- OC->06 心塞!
- 10005---SpringMVC REST
- 计蒜客 难题题库 007 奇怪的国家
- Java常用排序算法/程序员必须掌握的8大排序算法
- 读书笔记《深入理解C++对象模型》
- Spark 1.4 code structure
- HIVE函数表
- 计蒜客 难题题库 008 字符串长度
- 对自己的了解
- 机房收费系统合作版之初体验
- mac下的git的安装与简单的配置
- 拉姆斯菲尔德规则读书笔记
- leetcode 217 Contains Duplicate 数组中是否有重复的数字