C++对象模型学习
更新记录 时间 更新记录 2020年4月6日 初稿 背景 自从转入iOS,学习到iOS的方法调度,runTime的知识,了解了一下iOS的对象模型。 为了对iOS有更深入的了解,也对之前所学习的C++做一些补充,特此先学习一下C++的对象模型(说来也惭愧,windows开发一年半,没有看到C++对象模型相关的书或者网文) 三种对象模型 简单对象模型 所有的成员变量、成员函数都作为对象在内存中的一部分 简单、粗暴 缺点:占用内存大,以生成对象个数线性递增。 函数是所有对象共用,其实没有必要每个对象都记录,可以统一到某个地方。 表格驱动模型 区分数据成员和函数成员 对象只存放数据表指针和函数表指针,所以对象内存固定 针对于简单对象模型,表格驱动模型把数据成员列表作为每个对象独有的内存数据,而成员函数表则作为所有对象共享的内存数据,即可以解决简单对象模型“占用内存多”的问题 缺点 无法支持多态(确切地说,支持起来就比较复杂或者麻烦) 查找数据成员时,较第一种方案多了一次寻址。而且每个对象都多了一个表格指针,内存升高了。 (要知道C++可是非常重视性能的,每次查找数据成员都要多一次寻址,而数据成员可能用的很多) 调用成员函数时,较第一种方案多了一次寻址。 同上,C++的成员函数也可能调用的很频繁 当前的C++对象模型 对象第一个字节(32位系统下)存储虚函数表指针(如继承树上有虚函数)