首页 > 代码库 > 类类型的大小

类类型的大小

1:先看一个空类的大小:

#include <iostream>using namespace std;class A{}; int main(int argc, char** argv) {	cout<<sizeof(A)<<endl;	return 0;}


sizeof(A)的结果为1;

#include <iostream>using namespace std;class A{	public:		A();		~A();}; int main(int argc, char** argv) {	cout<<sizeof(A)<<endl;	return 0;}


sizeof(A)的结果照样为1;

 

首先,说类的大小本质上是说类的实例的大小,类只是一个类型定义,它是没有大小可言的,用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小;

calss A; A a; szieof(A) == sizeof(a);但是这样编译在编译器当中编译不通过。

上面为什么sizeof(A)的结果为1呢?

(1)因为一个空类也要实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存当中都有独一无二的地址。同样空类也要被实例化,所以编译器会给空类

添加一个隐含的字节,这样空类实例化后就有了独一无二的地址了。

(2)而析构函数,跟构造函数这些成员函数,是跟sizeof无关的,也不难理解因为我们的sizeof是针对实例,而普通成员函数,是针对类体的,一个类的成员函数,多个实例也

用相同的函数指针,所以自然不能归为实例的大小。

 

带参数类型的大小:

#include <iostream>/* run this program using the console pauser or add your own getch, system("pause") or input loop */using namespace std; class A{	public:	int a;	A()	{	}	~A()	{	}};int main(int argc, char** argv) {	A a;	cout<<sizeof(A)<<endl;	return 0;}


sizeof(A) = 4;

 

带静态类型参数的大小:

#include <iostream>/* run this program using the console pauser or add your own getch, system("pause") or input loop */using namespace std; class A{	public:	static int a;	A()	{	}	~A()	{	}};int main(int argc, char** argv) {	A a;	cout<<sizeof(A)<<endl;	return 0;}


sizeof(A) = 1;

类的静态数据成员被编译器放在程序的一个global  data members中,它是类的一个数据成员.但是它不影响类的大小,不管这个类实际产生了多少实例,还是派生了多少新的类,静态成员数据在类中永远只有一个实体存在,而类的非静态数据成员只有被实例化的时候,他们才存在.但是类的静态数据成员一旦被声明,无论类是否被实例化,它都已存在.可以这么说,类的静态数据成员是一种特殊的全局变量

 

带一个虚函数类型的大小:

#include <iostream>/* run this program using the console pauser or add your own getch, system("pause") or input loop */using namespace std; class A{	public:	A()	{	}	virtual ~A()	{	}};int main(int argc, char** argv) {	A a;	cout<<sizeof(A)<<endl;	return 0;}


sizeof(A) = 4;

 

带多个虚函数的大小

#include <iostream>/* run this program using the console pauser or add your own getch, system("pause") or input loop */using namespace std; class A{	public:	A()	{	}	virtual void fun()	{	}	virtual ~A()	{	}};int main(int argc, char** argv) {	A a;	cout<<sizeof(A)<<endl;	return 0;}


sizeof(A) = 4;

如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态的关键。而虚函数本身和其他成员函数一样,是不占用对象的空间的.

 

再看下面一段代码:

#include <iostream>/* run this program using the console pauser or add your own getch, system("pause") or input loop */using namespace std; class A{};class B{	char c;};class C{	char a;	char b;	virtual ~C()	{	}};class D{	int a;	void fun()	{		int m;	}	};int main(int argc, char** argv) {	cout<<sizeof(A)<<endl; //1	cout<<sizeof(B)<<endl; //1	cout<<sizeof(C)<<endl; //8	cout<<sizeof(D)<<endl; //4			return 0;}


输出 1 1 8 4;

结合这个实例  我们可以得出以下结论:

在一个类中,普通成员函数,构造函数,析构函数,所有的虚函数,以及静态成员变量都是不占用类对象的内存空间的。

一个类对象的大小  等于 VPTR(虚函数指针)+ 非静态数据成员变量 + 内存对其时候的扩展内存大小!

 

继承的类的大小:

<span style="color:#000000;">#include <iostream>/* run this program using the console pauser or add your own getch, system("pause") or input loop */using namespace std; class A{	static int a;};class B : public A{	public:		virtual int getNun()		{			return 10;		}	private:		char* p;};class C: public B{	public:				int getNum()		{			return 3;		}		B b;};int main(int argc, char** argv) {	cout<<sizeof(A)<<endl; //1	cout<<sizeof(B)<<endl; //8	cout<<sizeof(C)<<endl; //16	return 0;}</span>

1.类的大小为类的非静态成员数据的类型大小之和,也就是说静态成员数据不作考虑。

2.普通成员函数与sizeof无关。

3.虚函数由于要维护在虚函数表,所以要占据一个指针大小,也就是4字节。

4.类的总大小也遵守类似class字节对齐的,调整规则


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

类类型的大小