前言:
c++ language博大精深,需要我们透过现象看清本质才是正道。不积硅步,无以至千里;不积小流,无以成江海。坚持总结,坚持写作。下面是对第四周的作业的总结。
1. 对象模型图
2. 内存对齐
以下结果来自vs2017 x86。Fruit占32字节,Apple占40字节。
3. 一些相关知识点总结
(1) 数据类型所占字节:long int 在windows x64下也是占4个字节,windows x64下只有指针会扩展为8字节,其他的数据类型都和32位下是一致的。
(2) 虚函数表中虚函数的地址是按照类中声明顺序排列的,对于派生类没有覆盖的虚函数,基类的虚函数地址放在前面,派生类的虚函数地址放在后面。对于派生类覆盖定义的虚函数,则在虚函数表中,存放在原来基类中该虚函数的地址放置的位置上。
(3) 虚函数表最后有一个结束节点,如果值是0,那么表示是这个对象的最后一个虚函数表;如果是1,那么表示后面还有虚函数表。(这样设计应该是为了多重继承,方便查找虚函数。如果多个基类含有虚函数表,那么派生类对象也会相应有多个虚函数指针,指向各自虚函数表。)
(4)多重继承,派生类的成员函数放在第一个基类的虚函数表中,按照声明顺序排列父类。子类的虚函数会覆盖相应的含有这个虚函数的各个父类的虚函数表中的位置。
(5)含有虚函数的类对象有各自的虚函数表,虚函数表不共用,虚函数共用。(这样设计的好处,之后再思考)
(6) 不同编译器和操作系统下,对象的内存布局和所占空间大小有所不同。
(7) RTTI在运行时的类型识别,eg, typeid(obj).name() 会返回一个字符串,表示obj的类型,如class Fruit。不同编译器返回的字符串会有区别。type_info的指针存放在虚函数表中第一个地址的前面,第一个地址是第一个虚函数的地址 。两个运算符:typeid,dynamic_cast.
(8)内存对齐,取类中成员最大占用的大小来对齐。
ps. 时间紧迫,以后会继续补充。另外c++笔记3中对原型模式的理解很有偏差,后面会做更改。