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


    转自:http://blog.csdn.net/alexwei2009/article/details/6157926

    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的大小。

  • 相关阅读:
    【BZOJ4444】国旗计划
    NOIp模拟赛三十一
    [arc086e]snuke line
    NOIp模拟赛三十
    [agc004f]namori
    [agc004d]salvage robot
    [agc016b]colorful hats
    NOIp模拟赛二十九
    [arc082f]sandglass
    Oracle性能报告--ASH
  • 原文地址:https://www.cnblogs.com/kira2will/p/3657452.html
Copyright © 2020-2023  润新知