【深入探索c++对象模型】类对象所需内存大小讨论
2014-03-06 12:15
429 查看
class OO //Object-Oriented { public: OO():a(1),b(2),c(3){} virtual int fun_oo(){}; virtual int fun_oo_cpy(){}; int a; int b; int c; static int temp; }; int main() { int size = 0; OO test; size = sizeof(test); cout << "OO的大小为:" << size << endl; }
g++编译后显示大小为16,有两点需要说明:
1、static的数据并保存在类对象里面;
2、由于里面有虚函数,所以需要一个vptr,只想class里面的virtual table
接着讨论在继承情况下的大小,修改代码为:
#include<iostream> using namespace std; class O { public: int z; virutal int fun_O(){}; } class OO:public O //Object-Oriented { public: OO():a(1),b(2),c(3){} virtual int fun_oo(){}; virtual int fun_oo_cpy(){}; int a; int b; int c; static int temp; }; int main() { int size = 0; OO test; size = sizeof(test); cout << "OO的大小为:" << size << endl; }
g++编译后显示大小为20,这说明在这种继承体系下,对于对象test只有一个vptr被维护;
接下来讨论虚拟继承下的对象大小,修改代码为:
#include<iostream> using namespace std; class O { public: int z; virutal int fun_O(){}; } class OO:public virtual O //Object-Oriented { public: OO():a(1),b(2),c(3){} virtual int fun_oo(){}; virtual int fun_oo_cpy(){}; int a; int b; int c; static int temp; }; int main() { int size = 0; OO test; size = sizeof(test); cout << "OO的大小为:" << size << endl; }
g++编译后显示大小为24,这说明在这种继承体系下,对于对象test不仅有有一个vptr被维护,只想OO的virtual table;还有一个vptr指向virtual base class的virual table。
《深度探究c++对象模型》中有一句话“每一个base class constructor设定其对象的vptr,使它指向相关的virtual table 之后,构造中的对象可以严格而正确的编程构造过程中所幻化出来的每一个class的对象”,可以很好的解释这个现象。
相关文章推荐
- 【深入探索c++对象模型】类对象所需内存大小讨论续写
- 【深入探索c++对象模型】c++中构造函数调用虚函数的讨论
- 深入探索C++对象模型之虚继承
- 深入探索C++对象模型之成员绑定
- 深入探索C++对象模型一书中拷贝构造函数和NRV关系探讨
- 深入探索C++对象模型(四)
- 《深入探索C++对象模型》第六章 执行语意学
- Data语意学之虚继承和虚函数对C++对象内存模型造成的影响(类/对象的大小)
- [读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端(中)
- 深入探索C++对象模型笔记之五 —— 构造函数语意学 (成员们的初始化队伍 Member Initialization List)
- [读书笔记] 深入探索C++对象模型-第四章-Function语义学(中续)
- 深入探索C++对象模型:第二章构造函数语意学
- 深入探索C++对象模型(三)
- 深入探索C++对象模型笔记一 —— 关于对象(上)
- 《深入探索C++对象模型》笔记之第一章关于对象
- 深入探索C++对象模型之指向成员函数的指针
- C++ 零散知识点速记 -- <深入探索C++对象模型> 读书笔记
- 深入探索C++对象模型 第二章 构造函数语意学
- 深入探索C++对象模型之六 --- 执行期语意学
- [读书笔记] 深入探索C++对象模型-第三章 Data语义学(中)