【c语言】[内存对齐]结构体大小的计算

@ 目录

结构体大小不规则的原因

	结构体大小的计算,不仅仅只是各个类型单纯加起来。
	结构体在底层实现中,需要顾及到执行效率--
	  	"以空间换时间"
	结构体所占内存空间可以多些没关系
	但是对结构体内的成员变量访问速度必须提上去
	提高访问速度,就是让结构体每个成员变量都占一样大小的字节
	即让每个变量的步长一致
	或者整体的步长一致
	用官方的话说就是“内存对齐”

一、无嵌套结构体计算

  结构体的大小=最终的偏移量
  偏移量:从第一个变量开始,依次按变量类型所占的字节 [递加] 所得的值
  偏移量(结构体大小)的计算,一般遵循以下两条规则。
   (1) 结构体中成员的偏移量必须是该成员所在字节数的整数倍。
      (任一变量之前的字节加起来要为当前变量所占字节的整数倍)
   (2) 结构体的大小必须是所有成员的整数倍,即最小公倍数。

例子(1)

struct node
{
    
    
	char a;// 1+3 
	int b;// 4		据规则(1) , a 占字节要加 3 与 b 对齐
	double c;//8
};
变量 字节 计算
char a 1 1+3
int b 4 4
double c 8 8
总计 16 1+3+4+8=16

例子(2)

struct node
{
    
    
	int a;
	char b;
	int c;
};
变量 字节 计算
int a 4 4
char b 1 1+3(加3与 a 对齐)
int c 4 4
总计 12 4 + 1+3 +4 =12

二、有嵌套结构体计算

	有嵌套的结构体 则需要 先展开 嵌套结构体
   (1) 结构体中成员的偏移量必须是该成员所在字节数的整数倍。
      (任一变量之前的字节加起来要为当前变量所占字节的整数倍)
   (2) 结构体的大小必须是所有成员的整数倍,即最小公倍数。
struct kit
{
    
    
	int a;
	int b;
	double c;
};
struct node
{
    
    
	char A;
	struct kit c;
	char B;
};

上面的等同于下面这个

struct node
{
    
    
	char A;
	int a;
	int b;
	double c;
	char B;
};
变量 字节 计算
char A 1 1+3 (加3与 a 对齐)
int a 4 4
int b 4 4 +4(加4与 c 对齐)
double c 8 8
char B 1 1+7(加 7 与所有成员变量对齐)
总计 32 1+3 +4 +4+4 +8 1+7=32

总结

2021.3.26 23:34 二次更新
ps: 突然发现这篇博客之前的样子写成了我最讨厌的样子,很难让人理解,有违初心,特此修正。明天就要考二级啦,希望能够顺利通过吧!

猜你喜欢

转载自blog.csdn.net/weixin_42703673/article/details/111911974