类在内存中是如何分配的
一个类,有成员变量:静态与非静态之分;而成员函数有三种:静态的、非静态的、虚的。
那么这些个东西在内存中到底是如何分配的呢?
(1)C++中,应该是对象才会被分配内存空间吧??为什么CObject内存大小刚好和两个成员变量的大小之和一致!难道还没实例化的时候,类就已经有了内存空间了?
sizeof(CObject)是在编译时就计算了的,一个类定义了,它所占的内存编译器就已经知道了,这时只是得到它占用的大小,并没有分配内存操作 。也可以这样想:编译器肯定知道大小了,这与分配内存空间无关,知道大小了,以后实例化了才能知道要分配多大。
(2)当对象生成了之后,算出的内存,函数难道不占用内存空间吗?至少应该放个函数指针在里面的吧?内存是怎样布局的?
类的普通函数和静态成员函数是不占用内存的,至于函数指针,确实有,如果一个类中存在虚函数,则会自动生成一个虚函数指针指向虚函数表,这个时候,类的实例便会增加4个字节。
其实类的成员函数和普通的全局函数一样,只不过是在编译的时候给成员函数添加一个指向类对象指针的参数,成员函数地址是全局已知的,根本无须给他一个函数指针,类中成员函数代码都是相同的,如果占用内存,则每个实例都开辟空间,这样会造成大量空间的浪费。
类的属性是指类的数据成员,实例化一个对象就会给数据成员分配一个内存空间,而成员函数是共有的,成员函数不占用内存
静态成员函数没有this指针,因此只能访问静态数据,不能访问非静态数据成员。总之,程序中所有的代码都位于代码区。
sizeof是针对实例的,实例的话就看非静态数据成员,而成员函数是类体的,多个实例调用同一个函数指针,自然不属于实例的一部分,所以不占用实例的内存
(3)静态成员属于类吗,怎么类的大小中没有包含静态成员的大小?
属于类,但它并不属于某个对象,类的大小也需要看对象的大小,sizeof看的是对象的大小。
(4)D *d=NULL; d->printA(); d->printB(); // printA()为成员函数 printB()为虚函数
类中包括成员变量和成员函数 new出来的对象只是为数据成员开辟内存空间,成员函数始终存在
所以如果成员函数未使用任何成员变量的话,不管是不是static的,都能正常工作