今日刷题之计算结构体大小以及内存对齐现象

目录

1.求字节数

2.计算结构体大小的方法

(1)内存对齐现象

(2)内存对齐规律


1.求字节数

struct A
{
	char t; //1;
	char k; //1;
	unsigned short i; //2;
	unsigned long m;//4
};
int main()
{
	cout << sizeof(unsigned short) << endl;//2
	cout << sizeof(unsigned long) << endl; //4
	cout << sizeof(A) << endl;//1+1+2+4=8
}

截图:

给大家整理出来:在64位系统里,unsigned short :2个字节

unsigned long:4个字节

扫描二维码关注公众号,回复: 14945766 查看本文章

ps:如果忘了哪个类型是多大,可以用sizeof哦。

当然结构体的大小并不仅仅是各个数据类型所占字节数相加。

2.计算结构体大小的方法

(1)内存对齐现象

①为什么要进行内存对其?

       性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

      平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

     空间原因:没有进行内存对齐的结构体或类会浪费一定的空间,当创建对象越多时,消耗的空间越多。

(//与顺序有关
//char c;//1>4
//int a;//4
//short b;//2>4  //12个字节

//char c;//1>2
//short b;//2
//int a;//4   //一共8个字节

int a;//4
char b[5];//1*5>8   12字节

struct asd1{
	char a;
	int b;
	short c;
	double d;
};//24个字节
 
struct asd2{
	char a;
	short b;
	int c;
	double d;
};//16个字节 2+2+4+8

(2)内存对齐规律

从上往下依次观察,如果第二个所占字节较大,第一个数据就要向第二个数据类型对齐,当出现第三个数据类型的时候,如果第三个所占字节比第二个小,就还是向第二个对齐(第一段代码),反之,如果第三个所占字节是第二个的倍数,则不用对齐(第二段代码)

特殊的是,double 对齐需要最后的结果是8的倍数,第四段代码:4 +4+4+8=20 需要补4才是8的倍数 所以24个字节

猜你喜欢

转载自blog.csdn.net/weixin_62456756/article/details/128358706