码迷,mamicode.com
首页 > 编程语言 > 详细

C++内存布局

时间:2014-07-30 14:41:43      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:http   strong   io   cti   ar   div   c++   size   

#对象内存布局分类讨论

vc6变量查看器中(Locals,Watch1等),也可以看到部分对象布局的情况(不完整,且虚继承是错误的)。

vs2005及以后版本的编译器提供了/d1reportSingleClassLayout[类名]编译选项来查看对象完整的内存布局:

cl classLayout.cpp /d1reportSingleClassLayoutCChildren

0. 单一类

(1). 空类

bubuko.com,布布扣

sizeof(CNull)=1(用于标识该对象)

(2). 只有成员变量的类

bubuko.com,布布扣

int nVarSize = sizeof(CVariable) = 12

 bubuko.com,布布扣

内存布局:

bubuko.com,布布扣

(3). 只有虚函数的类

bubuko.com,布布扣

int nVFuntionSize = sizeof(CVFuction) = 4(虚表指针)

 bubuko.com,布布扣

内存布局:

bubuko.com,布布扣

(4). 有成员变量、虚函数的类

bubuko.com,布布扣 

int nParentSize = sizeof(CParent) = 8

bubuko.com,布布扣

内存布局:

bubuko.com,布布扣

1. 单一继承(含成员变量、虚函数、虚函数覆盖)

bubuko.com,布布扣

int nChildSize = sizeof(CChildren) = 12

vc中显示的结果(注:还有1个虚函数CChildren::g1没有被显示出来):

bubuko.com,布布扣

d1reportSingleClass查看:

bubuko.com,布布扣

内存布局:

bubuko.com,布布扣

2. 多继承 (含成员变量、虚函数、虚函数覆盖)

bubuko.com,布布扣

int nChildSize = sizeof(CChildren) = 20

vc中显示的结果(注:还有2个虚函数CChildren::f2,CChildren::h2没有被显示出来,this指针的adjustor值也没打印出):

bubuko.com,布布扣

d1reportSingleClass查看:

bubuko.com,布布扣

内存布局:

bubuko.com,布布扣

3. 深度为2的继承(含成员变量、虚函数、虚函数覆盖)

 bubuko.com,布布扣

int nGrandSize = sizeof(CGrandChildren) = 24

vc中显示的结果(注:还有3个虚函数CGrandChildren::f2,CChildren::h2,CGrandChildren::f3没有显示出来,this指针的adjustor值也没打印出):

bubuko.com,布布扣

d1reportSingleClass查看:

bubuko.com,布布扣

内存布局:

bubuko.com,布布扣

4 重复继承(含成员变量、虚函数、虚函数覆盖)

 bubuko.com,布布扣

int nGrandSize = sizeof(CGrandChildren) = 28

vc中显示的结果(注:还有大量的虚函数没有显示出来,this指针的adjustor值也没打印出):

bubuko.com,布布扣

d1reportSingleClass查看:

bubuko.com,布布扣

内存布局:

bubuko.com,布布扣

由于m_nAge在内容中存在两个拷贝,因此我们不能直接通过pGrandChildrenA->m_nAge来访问该变量,

这样会存在二义性,编译器无法知道应该访问CChildren1中的m_nAge,还是CChildren2中的m_nAge。

为了标识唯一的m_nAge,就需要带上其所在范围的类名了。如下:

1 pGrandChildrenA->CChildren1::m_nAge = 1;2 pGrandChildrenA->CChildren2::m_nAge = 2;

5. 单一虚继承(含成员变量、虚函数、虚函数覆盖)

 bubuko.com,布布扣

int nChildSize = sizeof(CChildren) = 20

d1reportSingleClass查看:

bubuko.com,布布扣

内存布局:

 bubuko.com,布布扣

6. 多虚继承(含成员变量、虚函数、虚函数覆盖)

(1) virtual CParent1, CParent2

bubuko.com,布布扣

int nChildSize = sizeof(CChildren) = 24

d1reportSingleClass查看:

bubuko.com,布布扣

内存布局:

bubuko.com,布布扣

(2) CParent1, virtual CParent2

bubuko.com,布布扣

int nChildSize = sizeof(CChildren) = 24

d1reportSingleClass查看:

bubuko.com,布布扣

内存布局:

bubuko.com,布布扣

(3) virtual CParent1, virtual CParent2

bubuko.com,布布扣

int nChildSize = sizeof(CChildren) = 28

d1reportSingleClass查看:

bubuko.com,布布扣

内存布局:

bubuko.com,布布扣

7. 钻石型的虚拟多重继承(含成员变量、虚函数、虚函数覆盖)

bubuko.com,布布扣

int nGrandChildSize = sizeof(CGrandChildren) = 36

d1reportSingleClass查看:

bubuko.com,布布扣

内存布局:

bubuko.com,布布扣

#外部参考

C++内存布局,布布扣,bubuko.com

C++内存布局

标签:http   strong   io   cti   ar   div   c++   size   

原文地址:http://www.cnblogs.com/wzzhj/p/3877988.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!