首页 > 编程语言 > 详细

sizeof一个类(c++常问问题十一)

时间:2016-01-29 20:02:57      阅读:130      评论:0      收藏:0      [点我收藏+]

下面直接上代码说明:

1.当sizeof一个空类(结构体):

class base
{
public:
	base();
	base(int n);
};

class node : public base
{
	node();
	node(int n):base(n)
	{
		//...
	}
};

struct MyStruct
{

};

void main()
{
	cout<<sizeof(base)<<endl;//输出结果为:1
	cout<<sizeof(node)<<endl;//输出结果为:1
        cout<<sizeof(MyStruct)<<endl;//输出结果为:1

	system("pause");
} 

因为一个空类也要实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。

同样空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1。(结构体也适用)

 

2.当一个空类里面有虚拟函数

class base
{
public:
	base();
	virtual void getSomeThing();
};

class node : public base
{
	node();
};

void main()
{
	cout<<sizeof(base)<<endl;//结果为4
	cout<<sizeof(node)<<endl;//结果为4

	system("pause");
}
base中有个虚函数,那就存在个V表,V表中存放一个虚指针来记录这个函数。32位下指针的大小为4.

class base
{
public:
	base();
	virtual void getSomeThing();
};

class node : public base
{
	node();
	virtual void getSomeTime();
};

void main()
{
	cout<<sizeof(base)<<endl;//输出结果4
	cout<<sizeof(node)<<endl;//输出结果4

	system("pause");
}

当子类去继承有V表的基类时,虽然他们的虚拟函数不一样,但是他们能公用一个指针,所以结果也是4

 

3.当基类是虚基类的时候,他们就不能公用V表了(前面我的文章有专门介绍)

class base
{
public:
	base();
	virtual void getSomeThing();
};

class node : virtual public base
{
	node();
	virtual void getSomeTime();
	char a;
};

void main()
{
	cout<<sizeof(base)<<endl;//输出结果4
	cout<<sizeof(node)<<endl;//输出结果16

	system("pause");
}

分析:

base因为有V表,所以他的长度为32位系统下一个long的长度,所以结果为4

node的16是怎么来的呢?(base的V表=4 , 虚拟继承基类的指针=4 ,自己的V表=4 , 由于字节对齐的原因char填充以后把长度补满为最长长度(long)的倍数=16

 

sizeof一个类(c++常问问题十一)

原文:http://www.cnblogs.com/JensenCat/p/5169764.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!