栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 类的存储

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 类的存储

#include 
using namespace std;

struct Test		//24,对齐数 = 8
{
	int age;			//0
	long long id_num;	//8
	short school_num;	//16
};                      //结构体大小:(1 + (7) + 8 + 2) + 6 = 24

class PeoPle
{
public:
	PeoPle() {}
	void func()
	{
		cout << "PeoPle::func" << endl;
	}
private:
	char a;			//0
	short b;		//2,对齐数 = 2
	char c;			//4
	int e;			//8,对齐数 = 4
	long long f;	//16,对齐数 = 8
	char g;			//24
	Test test;		//32,对齐数 = 8
	char h;			//56
};		
		//VS的默认对齐参数为8
		//上面People类所占空间:
        //(1 + (1) + 2 + 1 + (3) + 4 + (4) + 8 + 1 + (7) + 24 + 1) + 7 = 64
		//类的成员函数指针存储在公共空间处,不同的类对象调用同一个成员函数指针

int main()
{
	cout << sizeof(Test) << endl;		//24
	cout << sizeof(PeoPle) << endl;		//64
	PeoPle* p = nullptr;				//PeoPle::func
	p->func();
	return 0;
}

类的大小 = 基类的大小 + 成员变量大小 + 非虚类基的大小 + 虚函数指针大小

  • 成员变量不包括静态(static)变量,并且要考虑函数对齐
  • 虚函数可能有多个
  • 类的成员函数存储在公共空间内
  • 空类占1字节

内存对齐规则:

  • 第一个成员变量在与结构体偏移量为0的位地址处;
  • 其他成员变量要对齐到该成员对齐数的整数倍的地址处;
  • 对齐数 = 编译器默认的对齐数与该成员大小的较小值 (VS中默认对齐数为8);
  • 结构体(类)的总大小:最大对齐数(所有变量的最大者与默认对齐的较小值)的整数倍;
  • 如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍,总结构体的整体大小是最大对齐数(含嵌套结构体的对齐数)的整数倍

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019242.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号