c++class 内存布局
2015-05-05 20:48
183 查看
#include <iostream> using namespace std; class base1 { int a; double b; char c; }; int main() { base1 b; return 1; } vs输出class布局方法:先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1 reportSingleClassLayoutXXX(XXX为类名),则只会打出指定类XXX的内存布局
base1内存布局
![](http://images.cnitblog.com/blog2015/90280/201505/052033541106769.jpg)
#include <iostream> using namespace std; class animal { protected: int age; public: virtual void print_age(void) = 0; }; class dog:public animal { public: dog(){this->age = 2;} ~dog(){} virtual void print_age(void){cout<<"Wang,my age ="<< this->age<<endl;} }; class cat:public animal { public: cat(){this->age = 1;} ~cat(){} virtual void print_age(void){cout<<"Miao,my age ="<< this->age<<endl;} }; int main(void) { cat kitty; dog jd; animal * pa; int *p = (int*)(&kitty); int *q = (int*)(&jd); p[0] = q[0]; cout<<p[1]<<endl; cout<<q[1]<<endl; pa = &kitty; pa ->print_age(); system("pause"); return 0; }
内存布局:
![](http://images.cnitblog.com/blog2015/90280/201505/052042169704911.jpg)
![](http://images.cnitblog.com/blog2015/90280/201505/052042286105187.jpg)
![](http://images.cnitblog.com/blog2015/90280/201505/052042365019310.jpg)
这个内存结构图分成了两个部分,上面是内存分布,下面是虚表,我们逐个看。VS所带编译器是把虚表指针放在了内存的开始处(0地址偏移),然后再是成员变量;下面生成了虚表,紧跟在&[classname]_meta后面的0表示,这张虚表对应的虚指针在内存中的分布,下面列出了虚函数,左侧的0是这个虚函数的序号,这里只有一个虚函数,所以只有一项,如果有多个虚函数,会有序号为1,为2的虚函数列出来。
编译器是在构造函数创建这个虚表指针以及虚表的。
那么编译器是如何利用虚表指针与虚表来实现多态的呢?是这样的,当创建一个含有虚函数的父类的对象时,编译器在对象构造时将虚表指针指向父类的虚函数;同样,当创建子类的对象时,编译器在构造函数里将虚表指针(子类只有一个虚表指针,它来自父类)指向子类的虚表(这个虚表里面的虚函数入口地址是子类的)。
输出结果:
![](http://images.cnitblog.com/blog2015/90280/201505/052043190797735.jpg)
相关文章推荐
- C++ 内存布局(二) 虚继承 ---Empty virtual base classs (空虚基类)
- C++虚继承(四) --- /d1 reportSingleClassLayout插入看类内存布局
- [c/c++]class/struct数据在内存中的布局
- 【C++拾遗】 从内存布局看C++虚继承的实现原理
- C++ 对象的内存布局(上)
- C++对象模型之内存布局一
- (转帖)C++ 对象的内存布局----主要看virtual 继承的解释
- C++程序运行时内存布局之----------this到底是什么?
- 陈皓-C++ 对象的内存布局(上):笔记
- C++ 对象的内存布局(上)【转】
- C++ 对象的内存布局(上)
- C++对象模型:多重继承和虚继承的内存布局
- C++ 对象内存布局及其大小
- C++ 对象的内存布局(上)
- c++对象内存布局
- C++对象及多态实现探索之内存布局
- C++ 对象的内存布局(上)
- C++ STL deque 内存布局
- C++ 对象的内存布局(下)
- C++ 继承派生类中的内存布局