C++对象模型之数据成员模型(2)

原创 2004年01月27日 21:09:00

1.2.   虚拟继承与数据成员

考察下面的例子:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

0001   #include <iostream>
0002   //-------------------------------------------------------------------
0003   class x {};
0004   class y : virtual public x {};
0005   class z : virtual public x {};
0006   class A : public y, public z {};
0007   //-------------------------------------------------------------------
0008   int main()
0009   {
0010     cout << sizeof(x) << endl;
0011     cout << sizeof(y) << endl;
0012     cout << sizeof(z) << endl;
0013     cout << sizeof(A) << endl;
0014     int i;
0015     cin >> i;
0016   }

 

有两种模型,模型一:

 

sizeof(x) = 1;

sizeof(y) = 8;

sizeof(z) = 8;

sizeof(A) = 12;

 

模型如下结构:

 

字节

class x

1

char one byte because x is empty

 

字节

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

virtual base class x

char one byte

class y | class z

4

vptr

1

char one byte because y is empty

3

Padding 3 bytes

 

字节

virtual base class x

char one byte

class A

4

vptr_y

4

vptr_z

1

char one byte because A is empty

3

Padding 3 bytes

 

模型二:

 

sizeof(x) = 1;

sizeof(y) = 4;

sizeof(z) = 4;

sizeof(A) = 8;

 

模型如下结构:

 

字节

class x

1

char one byte because x is empty

 

字节

virtual base class x

char one byte

class y | class z

4

vptr

 

字节

virtual base class x

char one byte

class A

4

vptr_y

4

vptr_z

 

模型二和模型一的区别在于,模型二里面子类虽然是空,但是子类因为虚拟继承的关系,而不再使用一个字节的占位符,用来标识对象之间的区别,vptr指针已经可以区分对象间的不同。因此,模型二中的子类不需要一个字节的占位符,同时因为指针是4个字节,也就不再需要补齐,故而,每个子类对象都比模型一的子类对象少占据4个字节的空间。

图说C++对象模型

0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局、虚表指针、虚基类指针等有深入了解的朋友可以慢慢看。本文的结论都在VS2013上得到验证。不同的编译器在内存布局的细节上可...
  • LittleHorseBRO
  • LittleHorseBRO
  • 2016年06月29日 22:23
  • 465

《深入理解C++对象模型》读书笔记(一)

1、           C++类对象模型的中包括非静态成员变量和虚函数表指针,其他静态成员变量和成员函数均放在对象模型之外,所有的对象示例均可以共同使用。如此可以节省访问的时间和空间效率。   ...
  • zhiren2011
  • zhiren2011
  • 2015年07月31日 10:49
  • 1128

C++对象模型之数据成员模型(1)

第二章 数据成员模型1.1.   继承与数据成员考察下面的例子:0001   class Concrete10002   {0003   public :0004     int val;0005  ...
  • wxcwuxuchun
  • wxcwuxuchun
  • 2004年02月05日 00:43
  • 756

C++继承时的对象模型

点击打开链接 在没有继承时对象的内存模型很简单,成员变量和成员函数会分开存储: 对象的内存中只包含成员变量,存储在栈区或堆区(使用 new 创建对象);成员函数与对象内存分离,存储...
  • chengonghao
  • chengonghao
  • 2016年04月05日 09:20
  • 517

《深度探索c++对象模型》学习笔记

1、c++的布局和存取时间成本?封装并未给c++带来任何的空间或执行期的不良后果,c++在布局和存取时间上的主要额外负担由虚拟化引起。包括: 1)virtual function机制。用以支持一个有...
  • will130
  • will130
  • 2016年05月31日 15:48
  • 270

[读书笔记] 深入探索C++对象模型-第一章《关于对象》

最新在看深入探索C++对象模型(Inside C++ object model),看的同时针对一些之前没有留意或者理解不深的内容整理一下读书笔记,方便之后复习,也希望可以帮助到有同样疑惑的人。 下面是...
  • beyongwang
  • beyongwang
  • 2016年08月21日 21:14
  • 637

C++对象模型之数据成员内存布局

提前篇: 在内存中类的一个对象中存储的信息并不包括静态成员、成员函数、虚函数。 对于静态成员是当作全局变量来处理的,放在全局区,所以可以通过类名直接访问。 对于成员函数和静态成员函数也都当作全局函数来...
  • jluliuxy
  • jluliuxy
  • 2015年04月23日 20:05
  • 255

c++的几种对象模型

简单对象模型(Asimple ObjectModel): 这个模型的结构比较简单,他可能是为了尽可能降低C++编译器的设计复杂度而开发出来的,赔上的则是空间和执行期的效率。在这个模型中,member...
  • bhr2313122
  • bhr2313122
  • 2016年08月11日 22:03
  • 133

oc对象模型理解

首先,OC和Foundation是两个不同的东西,OC是一门编程语言,Foundation是一个为OC而生的为了方便程序员使用的编程框架。 这里可以用各司其职来形容它们:      作为一门面向对...
  • Make___
  • Make___
  • 2015年07月05日 17:40
  • 968

《深入理解c++对象内存模型》读书笔记

this指针的由来,虚函数的编译,多态的本质
  • FANYIYAO980404514
  • FANYIYAO980404514
  • 2015年03月29日 22:05
  • 1336
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++对象模型之数据成员模型(2)
举报原因:
原因补充:

(最多只允许输入30个字)