C++对象模型之简单对象模型(1)

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

第一章 简单对象模型

1.1.   空对象的大小

我们来看下面的这个类

class Empty

{

};

Empty这个类什么也不包含,其中没有任何数据和方法,那么,我们计算它所占据的空间大小sizeof(Empty)应该是多少呢?多数人认为应该是“0”,这似乎是毋庸置疑的,因为它什么也没有,不占据空间吗!但这到底对不对呢?我们来具体测试一下。

我们建立这样一个文件Test.cpp,包含如下代码:

0001   #include <iostream>

0002   #include <conio.h>

0003   using namespace std;

0004   //----------------------------------------------------------------

0005   class Empty

0006   {

0007   };

0008   //----------------------------------------------------------------

0009   int main(int argccharargv[])

0010   {

0011     cout << "Sizeof(Empty)" << '/t' << sizeof(Empty) << endl;

0012     getch();

0013     return 0;

0014   }

0015   //----------------------------------------------------------------

执行它,gcc得到的输出是“Sizeof(Empty)    1”,C++ Builder的结果是“Sizeof(Empty)    8”,全都不是“0”。这是为什么呢?原因很简单。空对象并不表示没有对象。例如:

Empty a,  b;

if (a == b)

 {

//do something

}

如果ab的大小是“0”,那么ab如何判断是否相同呢?它们都不包含任何内容,能否认为这两个对象就是同一个对象呢?显然是不能。那么又怎么能区分它们两个呢?这就需要它们包含点儿什么。那么事实上Empty对象的内存布局就应该为

 

char 占位

Empty Object内存布局

1.2.   简单数据对象

考察了空对象之后,我们再来看看包含了数据的对象的大小,如下一个类:

class Simple

{

  char a;

  int i;

};

它的大小由应该是多少呢?int类型占用4个字节空间,char类型占用一个字节空间,二者相加应该是“5”,慢着点,先不要急着下结论,我们再来验证一次,这一次得到的结果是“8”。为什么会是这样呢?额外的3个字节空间从哪里来的呢?这要从CPU的总线谈起,现在的计算机CPU普遍都是32位的,最有效率的数据传送方式莫过于一次4个字节,为了配合CPU的这个要求,编译器采用了补齐原则,给char类型补上了3个字节,于是乎Simple对象的大小变成了“8”。它的内存布局成为了

char a 1 Byte

补齐占位(3 Byte

int i 4 Byte

Simple对象内存布局

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

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

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

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

C++对象模型之简述C++对象的内存布局

在C++中,有两种类的成员变量:static和非static,有三种成员函数:static、非static和virtual。那么,它们如何影响C++的对象在内存中的分布呢? 当存在继承的情况下,其内存...
  • ljianhui
  • ljianhui
  • 2015年05月22日 02:28
  • 9711

C++对象的内存模型

转载自:http://c.biancheng.net/cpp/biancheng/view/2995.html点击打开链接 当对象被创建时,编译器会为每个对象分配内存空间,包括成员变量和成员函数。 ...
  • chengonghao
  • chengonghao
  • 2016年04月01日 09:25
  • 1296

深度探索c++对象模型

所谓知己知彼,百战不殆。只有深入了解了c++对象的内存布局,我们才能更熟练运用c++这门语言。 运行环境vs2013一单继承和多继承的结合class C { public: C() :c(1...
  • db199410
  • db199410
  • 2016年06月16日 17:40
  • 370

C++对象模型浅析

VTable 虚表 虚表的内存分布 一个简单的包含虚函数的类的声明 class A { public: virtual void v_a(){} virtual ~A...
  • whn_arthur
  • whn_arthur
  • 2016年02月23日 17:29
  • 365

C++面向对象模型初探

C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类。从计算机的角度,程序依然由数据段和代码段构成。 C++编译器如何完成面向对象理论到计算机程序...
  • lishuhuakai
  • lishuhuakai
  • 2015年05月23日 00:32
  • 865

JavaScript基础——浏览器对象模型(BOM)

简介 ECMAScript是JavaScript的核心,但如果要在Web中使用JavaScript,那么BOM(浏览器对象模型)则无疑才是真正的核心。BOM提供了很多对象,用于访问浏览器的功能,这些功...
  • Goskalrie
  • Goskalrie
  • 2016年06月20日 16:11
  • 2807

c++对象内存模型【内存布局】

#类中的元素 0. 成员变量   1. 成员函数   2. 静态成员变量   3. 静态成员函数   4. 虚函数   5. 纯虚函数 #影响对象大小的因素 0. 成员变量   ...
  • IT_YUAN
  • IT_YUAN
  • 2014年04月28日 16:30
  • 11840

文档对象模型DOM

DOM=DocumentObjectModel,文档对象模型,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。换句话说,这是表示和处理一个HTML或XML文档的常用方法。有一点很...
  • ailxxiaoli
  • ailxxiaoli
  • 2016年03月13日 15:55
  • 1834
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++对象模型之简单对象模型(1)
举报原因:
原因补充:

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