c++类实例在内存中的分配

原创 2011年01月22日 00:28:00

    c++是一种面向对象的编程语言,它向下保持了对c的兼容,同时也允许程序员能够自由的操控内存,虽然会带来一些问题,但这不是我们要探讨的问题,略过不表。类是对某种对象的定义,包含变量和方法,也可以理解为现实生活中一类具有共同特征的事务的抽象,他是面向对象语言的基础。所以类是不占有内存的,可是如果类生成实例那么将会在内存中分配一块内存来存储这个类。

    类的实例在内存中是如何分配内存的,有什么需要我们注意的,下面将慢慢到来。

    比如下面一个类:

    class A

    {};

    从形式上看,它似乎什么有没有,事实上它不止隐含了一个构造函数和一个析构函数,还有一些操作符重载函数,比如“=”。如果类A被实例话,如A a;在内存会占据多大的空间呢?有人可能会说4,也有人会说0,还有人会说1,说1的就对了,为什么会是1呢?原因有很多,如果我们定义一个数组A b[10];如果上面是0,这样的局面将会很尴尬,所以A这样一个空类,编译器会给它一个字节来填充。  

    增加一个变量,(字节对齐默认都是4)

    class  A

   {

     public:

          int i;

   }

  

   类A的实例将占据4个字节的内存,sizeof(A) = 4

   变量i 的初值被编译器指定位0xcdcdcdcd。

    再增加一个变量,

   class A

   {

      public:

      int  i;

      int  l;

   }

   此时按照变量生命的先后顺序,i被放在低地址上,l紧随其后。

   实例占用8个字节,sizeof(A) = 4*2 = 8

   如果累里面含有函数:

  class A

 {

     public:

      int i;

      int l;

      int add(int x,int y){return (x+y);}

 };

 有些人可能会说类的大小是12,事实上sizeof(A) = 8;

 为什么会这样,这是因为sizeof访问的程序的数据段,而函数地址则被保存在代码段内,所以最后的结果是8.

 再看下面这个情况

 class A

 {

      public:

         int i;

         int l;

         static int s;

         int add(int x,int y){return (x+y)};

 };

此时sizeof(A)大小仍为8,这里留给读者去思考为什么?(^-^)。

当类里面含有虚函数时,情况会如何呢?

 class A

 {

      public:

         int i;

         int l;

         static int s;

         virtual void Say(){};

         int add(int x,int y){return (x+y)};

 };

 因为含有虚函数,所以类里面将含有一个虚指针vptr,指向该类的虚表vtbl,一个指针占用四字节的地址,所以sizeof(A) = 12

 虚指针放在类实例地址的最低位置,

 比如 A *a = new A;

 我们可以这样给变量i赋值

int *p = (int *)a;
 p++;
 *p = 1;//把i的值赋为1.

如果类作为派生类,内存将如何分配呢?

这种情况虽然有些复杂,但并不是说不好理解。

他有多少个父类每个父类的大小加起来在加上自身就是sizeof的大小。

 

C++——类实例化内存的分配和this指针的使用

一、类的实例化分配内存 类是结构体的演变,是一种数据类型,如int和char一样是类型。那么在类实例化时,内存是怎样分配的呢? 步骤是:(可以通过代码考证) 1.属性、方法不需要初始化,因为这些全部是...
  • liufang1a2b
  • liufang1a2b
  • 2015年05月31日 01:05
  • 1546

c++类成员函数内存分配问题

原文来自:http://blog.csdn.net/caomiao2006/article/details/4934013 静态成员函数和静态成员变量不属于某个具体的对象,属于类;    ...
  • u012829687
  • u012829687
  • 2014年06月05日 09:44
  • 497

C++类对象成员变量与成员函数内存分配问题

很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样的。下面我们以类来说明问题,如果类的问题通了,结构体也也就没问题啦。 类分为成员变量和成员...
  • lfdanding
  • lfdanding
  • 2015年04月06日 11:59
  • 996

怎么限制一个类的对象实例,只能在"堆"上分配,或者只能在"栈"上分配

原文地址:http://blog.csdn.net/szchtx/article/details/12000867 在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如...
  • u010536615
  • u010536615
  • 2015年04月28日 16:35
  • 1512

类(继承)的内存分配详解

1.基类与派生类的内存分配 派生类继承基类       内存分配时,是在于基类对象不同的内存地址处,按基类的成员变量类型,开辟一个同样的类型空间,但注意开辟后派生对象的空间,不是复制基类的成员的值...
  • vainlyhopelim
  • vainlyhopelim
  • 2015年08月18日 16:38
  • 1661

C++ 内存分配allocator类

new有一些灵活性的局限,其中一方面表现在它将内存分配和对象构造组合在了一起。类似的,delete将对象析构和内存释放组合在了一起。我们分配单个对象时,通常希望将内存分配和对象初始化组合在一起。因为在...
  • u010984552
  • u010984552
  • 2016年10月24日 17:41
  • 623

C++类内存分布+钻石模型的解决方法

C++类内存分布#include using namespace std; class Base { private: int val; public: ...
  • huai1693838234
  • huai1693838234
  • 2015年03月23日 15:47
  • 933

c++五种内存分配、堆与栈区别

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。     栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常...
  • dapengbusi
  • dapengbusi
  • 2015年10月12日 10:14
  • 5394

C/C++动态分配与释放内存的区别详细解析

转自http://www.jb51.net/article/41723.htm 1. malloc()函数 1.1 malloc的全称是memory allocation,中文叫动态内存分配。 ...
  • a573233077
  • a573233077
  • 2016年01月14日 16:59
  • 3422

【面向对象】类和动态内存分配

类和动态内存分配 编译器生成的函数
  • wupenm
  • wupenm
  • 2015年09月02日 19:17
  • 1184
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++类实例在内存中的分配
举报原因:
原因补充:

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