结构体内存大小的计算

结构体:
由一系列具有相同类型或不同类型的数据构成的数据集合,属于自定义数据类型
结构体的声明格式:

struct iphone {
 //品牌
 char name[1024];
 //内存
 int rom;
 //运存
 int ram;
 //电池
 int power;
 //价格
 int price;
};

由上可见,struct iphone即是自定义的一个手机结构体,如果我们使用它可以采取如下方式:

//方式一:(初始化给值)
 struct iphone my = { "huawei", 256, 8, 4000, 8000 };
 //方式二:单独赋值
 struct iphone your;
 memcopy(your.name, "oppo");
 your.rom = 16;
 your.ram = 2;
 your.power = 1500;
 your.price = 1000;

那么如果我们想知道他的内存存储是怎样的呢?
接下来将简述结构体内存存储的规则,通过了解规则也能轻松的了解到结构体的内存大小:

 //1. 第一个成员在与结构体变量偏移量为0的地址处。
 //2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
 //3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
 //4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

接下能会让人疑惑的是那么每个编译器的默认对齐数该是多少?我们不需要去知道每个编译器的对齐数,去记忆这个很容易出错,而且有的编译器没有设有默认对齐数;所以在我们写代码之前需要添加上一句预编译指令#pragma pack(要设的默认对齐数值);如下:

#pragma pack(8)//设置默认对齐数为
struct iphone {
 char name;
 //内存
 int rom;
 //运存
 int ram;
 //电池
 int power;
 //价格
 int price;
};

那么此时我们来计算一下上面这个结构体的大小为多少?我们结合上面的规则画图表示出来:

在这里插入图片描述
红色部分的三个字节即是,int为了对齐,而被浪费掉的空间;
所以这个结构体占据的空间大小应为20;下面我们来测试一下

#pragma pack(8)//设置默认对齐数为8
struct iphone {
 char name;
 //内存
 int rom;
 //运存
 int ram;
 //电池
 int power;
 //价格
 int price;
};

int main()
{
 struct iphone your;
 printf("%d", sizeof(your));
 system("pause");
 return 0;
}

运行结果:
在这里插入图片描述

发布了22 篇原创文章 · 获赞 1 · 访问量 272

猜你喜欢

转载自blog.csdn.net/scacacac/article/details/104836002