您的位置:首页 > 其它

2.类在内存中是如何分配的

2016-04-24 20:32 162 查看
类在内存中是如何分配的

一个类,有成员变量:静态与非静态之分;而成员函数有三种:静态的、非静态的、虚的。

那么这些个东西在内存中到底是如何分配的呢?

(1)C++中,应该是对象才会被分配内存空间吧??为什么CObject内存大小刚好和两个成员变量的大小之和一致!难道还没实例化的时候,类就已经有了内存空间了?

        sizeof(CObject)是在编译时就计算了的,一个类定义了,它所占的内存编译器就已经知道了,这时只是得到它占用的大小,并没有分配内存操作
。也可以这样想:编译器肯定知道大小了,这与分配内存空间无关,知道大小了,以后实例化了才能知道要分配多大。

(2)当对象生成了之后,算出的内存,函数难道不占用内存空间吗?至少应该放个函数指针在里面的吧?内存是怎样布局的?

 
      类的普通函数和静态成员函数是不占用内存的,至于函数指针,确实有,如果一个类中存在虚函数,则会自动生成一个虚函数指针指向虚函数表,这个时候,类的实例便会增加4个字节。

 
      其实类的成员函数和普通的全局函数一样,只不过是在编译的时候给成员函数添加一个指向类对象指针的参数,成员函数地址是全局已知的,根本无须给他一个函数指针,类中成员函数代码都是相同的,如果占用内存,则每个实例都开辟空间,这样会造成大量空间的浪费。

 
     类的属性是指类的数据成员,实例化一个对象就会给数据成员分配一个内存空间,而成员函数是共有的,成员函数不占用内存

 
     静态成员函数没有this指针,因此只能访问静态数据,不能访问非静态数据成员。总之,程序中所有的代码都位于代码区。

 
     sizeof是针对实例的,实例的话就看非静态数据成员,而成员函数是类体的,多个实例调用同一个函数指针,自然不属于实例的一部分,所以不占用实例的内存

(3)静态成员属于类吗,怎么类的大小中没有包含静态成员的大小?

 
      属于类,但它并不属于某个对象,类的大小也需要看对象的大小,sizeof看的是对象的大小。

(4)D *d=NULL;    d->printA();
      d->printB();        //  printA()为成员函数   printB()为虚函数

     类中包括成员变量和成员函数                         new出来的对象只是为数据成员开辟内存空间,成员函数始终存在
     所以如果成员函数未使用任何成员变量的话,不管是不是static的,都能正常工作

        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: