码迷,mamicode.com
首页 > 其他好文 > 详细

struct和class内存大小的计算

时间:2018-10-27 16:40:54      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:最大   cpp   stream   对象   整数   div   out   void   还需   

结构体内存大小的计算:

用例一:

#include<stdio.h>
union ss
{
	int a;
	char b;
};
struct MyStruct
{
	int temp1;//4个字节
	char  temp2;//一个字节,补齐3个字节
	ss aa;//4个字节
	char temp3;//一个字节
	char temp4;//一个字节,补齐两个字节
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  输出 16

解析:对齐规则是按照成员的声明顺序,依次安排内存,对齐字节数为最大成员变量的字节大小,偏移量为最大成员变量的字节数的整数倍,在这个程序中对齐字节数为4,计算步骤如下:

首先是temp1 四个字节,temp2 一个字节,还剩3个字节,因为后面是aa 4个字节,可以自己对齐,所以temp2需要补齐3个字节, temp3 一个字节,temp4一个字节,对齐是4个字节,还剩2个字节需要补齐。所以总共是16个字节。

#include<stdio.h>
union ss
{
	int a;
	double b;
};
struct MyStruct
{
	int temp1;//4个字节
	char  temp2;//1个字节,对齐是8个字节,还需3个字节补齐
	ss aa;//8个字节
	char temp3;//1个字节
	short temp4;//2个字节,补齐还需要5个字节
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  输出结果为 24

#include<stdio.h>
union ss
{
	int a;
	double b;
};

struct student
{
	int name;
	char sex;
	double num;

};
struct MyStruct
{
	int temp1;//4个字节
	char  temp2;//1一个字节,补齐3个字节
	ss aa;//8个字节
	char temp3;//一个字节
	short temp4;//2个字节,补齐5个字节
	student people;//16个字节
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  结果为 40

解析:此时需要注意的是,对齐字节数8个字节,而不是16个字节。student people 对象内部先进行一次对齐,然后如果如果是外面对齐字节数的整数倍就不需要

再进行对齐了,如果不是就需要再次进行对齐。

下面的是需要二次对齐的程序:

#include<stdio.h>
struct MyStruct
{
	char temp1;
	char temp2;
};
struct student
{
	int name;//4个字节
	char sex;//1个字节
	MyStruct aa;//2个字节
	char temp;//1个字节

};
int main()
{
	printf("%d", sizeof(student));

}

  输出为 8 

#include<stdio.h>
union ss
{
	int a;
	double b;
};

struct student
{
	//int name;
	//char sex;
	int num;

};
struct MyStruct
{
	int temp1;//4个字节
	char  temp2;//1一个字节,补齐3个字节
	ss aa;//8个字节
	char temp3;//1个字节
	short temp4;//2个字节
	student people;//4个字节,补齐一个字节
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  输出结果为:24 

 

总结,在一个结构体中有另一个结构体的对象时,对齐字节数与这个结构体对象的字节数无关,只与结构体中的成员变量和union 有关。

 

类的内存大小的计算:

#include<iostream>
using namespace std;
class student
{
public:
	student() 
	{
		cout << "构造函数" << endl;
	}
	//void fun();
};
int main()
{
	cout << sizeof(student) << endl;
	return 0;
}

  运行结果: 1

解析:如果是空类也会输出1。如果一个类只含有成员函数没有成员变量或者虚函数,类的大小都是1。如果含有静态成员变量或者是静态成员函数,也会是1,因为静态成员变量和静态成员函数是类的所有对象共享的,它并不存放在一个实例化对象中

为什么空类也会是1呢?

所谓类的实例化就是在内存中分配一块地址,每一个实例在内存中都有独一无二的地址,而了到达这个效果,编译器往往会给一个空类隐含的增加一个字节,这样实例化出来的每一个空类的对象都会得到一个独一无二的地址。如果空类的大小是0的话,那么实例化出来的所有空类对象都是在同样一个内存地址上,就相当于同一个对象,这不是我们想要的。

struct和class内存大小的计算

标签:最大   cpp   stream   对象   整数   div   out   void   还需   

原文地址:https://www.cnblogs.com/wuyepeng/p/9862144.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!