[C++]深入探索C++对象模型笔记
文章目录
ch01 关于对象
-
C++在布局以及存取时间上的主要额外负担是 由virtual引起的,包括:
- virtual function 机制, 引入 vptr(指向一个对象的虚拟表的指针) 以及vtbl(虚拟表),支持一个有效率的"执行器绑定";
- virtual base class,用以实现“多次出现在继承体系中的base class,有一个单一而被共享的实例”
- 多重继承下,派生类跟 第二个以及后续基类 之间的转换
-
C++有三种方式 支持多态:
- 经由一组 隐式的转化操作,比如将派生指针转化为指向其基类的指针, shape* ps = new circle()
- 经由 virtual function机制 ps->rotate()
- 经由 dynamic_cast 和 typeid运算符 if(circle *pc = *dynamic_cast<circle > (ps))
-
一个类的对象内存大小包括
- 所有非静态数据成员的大小;
- 为支持virtual 有内部产生的额外负担;
- 由 内存对齐而填补的内存大小。
1 2 3 4 5 6 7 8 9 10
class ZooAnimal { public: ZooAnimal(); virtual ~ZooAnimal(); virtual void rotate(); protected: int loc; String name; }; // 在32位计算机上所占内存为16字节:int四字节,String8字节(一个表示长度的整形,一个指向字符串的指针),以及一个指向虚函数表的指针vptr。**对于继承类则为基类的内存大小加上本身数据成员的大小。**
-
“指针的类型” 会教导编译器如何解释某个特定地址中的内存内容以及其大小(void* 指针只能够持有一个地址,而不能通过它操作所指向的object)
-
C++通过class 的pointers 和 references 来支持多态,付出代价 是额外的间接性。 之所以支持多态是因为他们并不引发内存中任何 “与类型有关的内存委托操作(type-dependent commitment)",会受到改变的只有他们所指向的内存的"大小和内容的解释方式"而已。
-
C++类包含两种数据成员:静态数据成员 和 非静态数据成员;同时 包含 成员函数,静态函数 和 虚函数 三种成员函数。
ch02 构造函数语义学
ch03 Data语义学
ch04 Function语义学
ch05 构造、解构、拷贝 语义学
ch06 执行期语义学
ch07 站在对象模型的类段
参考资料
文章作者 fzhiy
上次更新 2022-03-27