刚开始看深度搜索C++对象模型这本书,听说这本书很好,所以打算暑期的时候看看,为了促进学习,所以会经常将自己的一些所得写出来,起到总结的作用,理解有错误的地方,还望大家指出来,谢谢了。
内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
数据成员: static data,nonstaticdata
函数static fun ,nonstatic fun,virtual fun
一.
1 C++会因为封装和继承在空间或者执行期带来不良后果吗?
不会,可以分析类里面的成员布局(后面会有解释)
2 C++在布局以及存取时间上的主要负担是谁引起的?
虚函数 和 虚继承
二 .C++对象模式
1 简单对象模型 :尽量降低C++编译器的设计复杂度,赔上的则是空间和执行期的 效率 一个object 是一系列的slot(防止因为成员对象的改变而改变内存大小) ,每一个slot指向一 个member
2 表格驱动模型:在简单模型的基础上再添加一个中间间隔,object 只含有两个指针,分别指向数据成员表和函数成员表,每张表里面也是一系列的slot 分别指向数据成员和函 数。
3 C++对象模型: 1 nonstatic data members 放在class object 内 ,static data members 则放在了静态存储区,static 和nonstatic函数成员也放在了obkect的外面。而对于 virtual 函数则有两步控制 vptr->vtbl->virtual fun
3.1 加上继承:对象模型是如何控制管理继承部分的。
简单模型是在其一个slot 中有个指针负责指向base class 缺点:增加了object 的空间和存储时间上的负担,优点是其大小不会随base class 改变 通过baseclass table 实现继承会随着继承的深度而增加
C++最初的继承模型是将base class 的 成员直接放在在derived class 里面。
小插曲:struct 与class 的冲突 C++里面保留struct是为了兼容C class的到来实现封装 继承 等特性。
三.对象的差异:
1 程序模型(程序自顶向下)
2 抽象数据模型(封装)
3 面向对象模型(继承思想)
四.那么一个object 的大小到底与那些因素有关,如何判断其大小
1 所有的nonstatic data members +由于要满足机器要求,要调节边界大小使其为某个值的倍数+虚函数或虚继承导致的指针