读书笔记《深入理解C++对象模型》

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);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值