C++类占字节数讲解

  • 空类的情况
    示例代码:
class B{

};

int _tmain(int argc, _TCHAR* argv[])
{
	cout << sizeof(B) << endl; //占8个字节
	system("pause");
	return 0;
}

申明了一个空类B,并在main函数中输出B类的占据字节数

  • 输出结果:
    在这里插入图片描述
    可以很明显的看出,B类占了1个字节的大小.
    占1字节的原因在于:
    空类也能被实例化,只要实例化就必须在内存中占据内存地址,而空类本身没有任何构造函数和虚函数,编译器会默认给空类隐含加上一个字节。系统会认为他被实例化。

  • 虚函数类
class B{
public:
	B(){

	};
	virtual ~B(){

	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	cout << sizeof(B) << endl; //占8个字节
	system("pause");
	return 0;
}
  • 输出结果:
    在这里插入图片描述

  • 主要原因是虚函数类需要构造虚函数表,虚函数表需要虚函数指针来确定具体使用那个函数的内存地址(这就涉及了函数重载的问题),一个虚函数指针占4个字节,所以实例化需要占用4个字节的内存地址。

  • 包含类成员

class B{
public:
	B(){

	};
	int demo;
	char ss;
};

int _tmain(int argc, _TCHAR* argv[])
{
	cout << sizeof(B) << endl; //占4个字节
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述
这边占据8个字节的原因是,一个int占4个字节,1个char占1个字节,但是由于字节对齐的原因,所以第2个元素占了4个字节。
何谓字节对齐:现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。


简单的介绍完毕,后续可以大家再深入研究一下,基本上,让大家对C++类占多少字节有个清晰的认识了

发布了365 篇原创文章 · 获赞 80 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/Giser_D/article/details/103915175
今日推荐