结构体(详解)

结构体

结构体的内存对齐

计算结构体的内存大小
看下面的代码,

#include<stdio.h>
struct s1
{
	char a;
	int b;
	char c;
};
struct s2
{
	char a;
	char b;
	int c;
};
int main()
{
	printf("%d \n", sizeof(struct s1));
	printf("%d \n", sizeof(struct s2));

	return 0;
}

这里的s1,s2结构体里面均存放了两个char类型的字符,以及一个整型类型的元素,只是顺序不同,但是我们发现,这里计算出来的两个结构体的大小竟然完全不同

我们在这里就需要引入一个概念:内存对齐;
1、第一个成员在与结构体变量偏移量为0的地址处
2、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
对齐数 = 编译器默认的一个对齐数与该成员大小的较小值
vs编译器中的默认值为8
Linux环境下,没有默认对齐数,当没有默认对齐数时,自身的大小就是对齐数
默认对齐数是可以修改的,#pragma这个预处理指令,可以用来修改默认对齐数。
在这里插入图片描述
当对齐数设置的不合理的时候,我们自己更改默认对齐数。

3、结构体总体大小为最大对齐数的(每个成员变量都有一个对齐数)整数倍
4、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

在struct s1 中,首先a要存储到0偏移量的地址处,接下来存储b,b是整型类型,占四个字节,它要存储到对齐数字的整数倍处,也就是偏移量为4处,,接下来存c,c就存放在偏移量为8的地址处,这个时候已经占了9个字节了,但是结构体的大小为最大对齐数的整数倍,int的最大整数倍为12,因此sizeof(struct s1)的大小为12个字节在这里插入图片描述
这里蓝色的空间为存储我们结构体用的空间,绿色的就为我们浪费掉的空间。
再来看struct s2首先a,b存储到偏移量为0,1,的位置处,因为char的对齐数为1,然后存储c,大小为4个字节,对齐数为4,因此sizeof(struct s2)的大小为8个字节,蓝色的为浪费掉的空间在这里插入图片描述
那么为什么会存在内存对齐呢?
1、平台原因
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因
数据结构(尤其是栈)应该尽可能的在自然边界上对齐
原因在于,为了访问未对齐的内存,处理器所需要做两次内存访问;而对齐的内存访问仅仅需要一次访问
总的来说,结构体的内存对齐是用空间来换取了访问效率

结构体传参

结构体在传参时,,要以结构体指针传参,要是结构体传参的话,形参就会创建一个新的结构体,这样传参的时候就会压栈,会浪费空间和时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值