# inside the c++ object model **Repository Path**: hucy001/insidethec_objectmodel ## Basic Information - **Project Name**: inside the c++ object model - **Description**: No description available - **Primary Language**: C++ - **License**: BSD-3-Clause-Clear - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-07-04 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # inside the c++ object model #### C++对象内存布局 ![avatar](https://images.gitee.com/uploads/images/2020/0706/105727_c14df052_7772011.png) a作为对象指针存储在栈中,指向在堆中的类A的实例内存,其中实例内存布局中有虚函数表指针,指针指向的虚函数表存放在数据段中,虚函数表中的各个函数指针指向的函数在代码段中 1. **普通类对象的布局** ![avatar](https://images.gitee.com/uploads/images/2020/0706/124714_459a7b50_7772011.png) 2. **带虚函数的类对象的布局** ![avatar](https://images.gitee.com/uploads/images/2020/0706/124714_f68a4006_7772011.png) 3. **单继承下不含有覆盖函数的类对象的布局** ![avatar](https://images.gitee.com/uploads/images/2020/0706/124714_e003c2a2_7772011.png) 4. **单继承下含有覆盖函数的类对象的布局** ![avatar](https://images.gitee.com/uploads/images/2020/0706/124714_97226067_7772011.png) 5. **多继承下不含有覆盖函数的类对象的布局** ![avatar](https://images.gitee.com/uploads/images/2020/0706/124714_ec6eefc4_7772011.png) 6. **多继承下含有覆盖函数的类对象的布局** ![avatar](https://images.gitee.com/uploads/images/2020/0706/124714_c62c29ce_7772011.png) 7. **多重继承不同的继承顺序导致的类对象的布局** ![avatar](https://images.gitee.com/uploads/images/2020/0706/124714_ba36148e_7772011.png) 8. **虚继承的布局** ![avatar](https://images.gitee.com/uploads/images/2020/0706/124714_ea60841b_7772011.png) 9. **虚继承带未覆盖函数的对象布局** ![avatar](https://images.gitee.com/uploads/images/2020/0706/124714_537ea527_7772011.png) 10. **菱形继承下类对象的布局** ![avatar](https://images.gitee.com/uploads/images/2020/0706/124715_9f2a3695_7772011.png) #### 工具查看内存布局 1. **用readelf,objdump查看:虚函数指针,虚函数表,静态数据成员,成员方法** readelf -s 可执行文件 ,可查看静态数据成员(data,bbs),常量数据成员(rodata),成员方法(text) objdump -s 可执行文件, 可查看虚函数指针和虚函数表(rodata) 2. **用clang查看对象实例的内存布局** clang -Xclang -fdump-record-layouts -stdlib=libc++ -c 源文件 3. **用gdb查看对象实例的内存布局** gdb 可执行文件 set print object on set print vtbl on set print pretty on break 类名::成员方法 r p *this #### 虚函数表结构 ![avatar](https://images.gitee.com/uploads/images/2020/0706/105754_f7996166_7772011.png) 1. offset_to_top:对象在对象布局中与对象顶部地址的偏移量 2. RTTI指针:指向存储运行时类型信息(type_info)的地址,用于运行时类型识别,用于typeid和dynamic_cast 3. vbase_offset:对象在对象布局中与指向虚基类虚函数表的指针地址的偏移量 4. vcall_offset:父类引用或指针指向子类对象,调用被子类重写的方法时,用于对虚函数执行指针地址调整,方便调用被重写的方法 5. virtual function pointer:虚函数表 6. thunk: 表示上面虚函数表中带有adjustment字段的函数调用需要先进行this指针调整,才可以调用到被子类重写的函数 #### 工具查看虚函数表结构 1. **用clang查看表结构** clang -Xclang -fdump-vtable-layouts -stdlib=libc++ -c 源文件 2. **用gdb查看表结构** gdb 可执行文件 set print object on set print vtbl on set print pretty on break 类名::成员方法 r info vtbl *this p /a *(void**)0x4009d8@8 查看虚函数表的内容 #### 参考资料 1. [https://blog.csdn.net/qq_28114615/article/details/98041319](https://blog.csdn.net/qq_28114615/article/details/98041319) 2. [https://my.oschina.net/u/4521971/blog/4335970](https://my.oschina.net/u/4521971/blog/4335970)