各种嵌套结构体struct对齐,共用体union,枚举enum字节计算,如何知道当前计算机位数

本文探讨了C语言中结构体的字节对齐规则,通过实例展示了不同成员大小如何影响对齐方式。分析了tTestEntry1、tTestEntry2和tTestEntry3三个结构体的内存布局,解释了为何需要按照成员最大size进行字节对齐以优化内存使用和提升性能。
摘要由CSDN通过智能技术生成

一、如何知道当前计算机的字节个数

#include <stdio.h>
int main(void)
{
	printf("The bytes of the variables in this machine are:\n");
	printf("char: %d byte\n",sizeof(char));
	printf("short: %d bytes\n",sizeof(short));
	printf("int: %d bytes\n",sizeof(int));
	printf("long: %d bytes\n",sizeof(long));
	printf("float: %d bytes\n",sizeof(float));
	printf("double: %d bytes\n",sizeof(double));
	printf("long long : %d bytes\n",sizeof(long long ));
	printf("long double: %d bytes\n",sizeof(long double));
}

编译运行,在目标机运行一下,就知道不同数据类型占几个字节

在这里插入图片描述
long形占用8个自己,由此也知道此计算机是64位系统,32位系统,long是4字节。

二、结构体对齐的意义
cpu执行一条指令,是按4字节取的,地址空间必须是4的倍数,如下
在这里插入图片描述

如下图,假如一个int整形变量,存放在0x02-0x06的地址,那么读取变量a时,需要先读取0x00,再读一次0x04,才能把a的数据读出来,增加了一次指令,那么性能降低一半,所以意义,就是增加执行效率,一次性把int型数据读出来
在这里插入图片描述

三、结构体字节对齐计算规则

1、测试1
在这里插入图片描述
按图中结构体,成员中最大是int型4字节,所以是4的倍数,char a 需要填充3个无效字节,char c 需要3个字节。

2、测试2
在这里插入图片描述
看图中,是64位操作系统,long型是8个字节,先看结构体1,最大是4,按4的倍数填充。结构体2是是按8的倍数填充,为什么
char g是填充3个呢,因为结构体1最大是4,按规则3,结构体h起始地址是4的倍数,所以变量g,也是按4的倍数填充,写个测试
程序如下,结果是对的

在这里插入图片描述
程序运行结果
在这里插入图片描述
做个修改,把结构体1的b换成long型,发现结构体2变成了56,因为变量g,需要按8字节对齐了。
在这里插入图片描述
程序运行结果
在这里插入图片描述
在这里插入图片描述

4、测试4,结构体1b变成short型,则按2的倍数算,结构体2 char g 则是按2的倍数来计算
在这里插入图片描述
运行结果
在这里插入图片描述
5、测试5,联合体,结构体嵌套联合体
在这里插入图片描述
运行结果
在这里插入图片描述
联合体是8个字节,因为只按最大字节的变量,分配一个公用地址。所以结构体2大小是40字节

6、测试6,内嵌枚举
gcc的规则,枚举无论多少个,都是一个常量,int型,4个字节,
在这里插入图片描述
在这里插入图片描述

总结,内嵌结构体时,按除结构体外,其他成员,最大数据类型整数倍对齐,内嵌的结构体,起始地址,需要内嵌结构体整数倍,或最大成员整数倍 ,比如char g变量,是内嵌结构体上面相邻位置,是内嵌结构体的起始地址,所以要结合变量结构体h,来计算。

六、设置成不对齐,或按需要对齐

#pragma pack(4)
在这里插入图片描述
在这里插入图片描述

结构体1按字节对齐后是24,结构2按2个字节对齐是40,

设置成不对齐,不填充,是多少个就是多少个
在这里插入图片描述
在这里插入图片描述

七、内嵌数组

在这里插入图片描述

运行结果是28,按int4个字节对齐
在这里插入图片描述
再修改下,把数组改成char型
在这里插入图片描述
运行结果是12个,
那是怎么对齐的呢,仍然按int4个字节对齐,char a需要结合b数组,a+b前面3个,后面两个填充2个。

在这里插入图片描述
在这里插入图片描述
运行结果是7个,嘿,想不通为啥,没法解释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值