结构体对齐

1.问题导入

#include"windows.h"
#include"stdio.h"
#pragma pack(8)
struct MyStruct
{
	char a;
	int b;
	char c;
};
struct MyStruct2
{
	int a;
    char b;
	char c;
	

};
int	main()
{
	printf("%d\n", sizeof(MyStruct));
	printf("%d\n", sizeof(MyStruct2));
}

两个含有相同的变量只是变量类型顺序不同的结构体的大小分别是多少呢?

在默认对齐方式为8字节的情况下

S1:12 B

a 0 0 0

b b b b

c 0 0 0

S2:8 B

a a a a b c 00

2.本质:以空间换时间,提高效率

2.1对齐参数:默认是8

在哪里查看和更改呢?

使用代码更改默认对齐参数

#pragma pack(n) n为指定的对齐参数,其值可以为 1,2,4,8,16

3.对齐规则

(1)数据成员对齐规则:结构体的数据成员,第一个数据成员要放在offset为0的位置,以后的每个数据成员存储的起始位置(与对齐参数比较选小的)要从较小值的整数倍开始

(2)结构体的总大小,必须是其内部最大成员(或是对齐参数两者较小值)的整数倍,不足补齐

(3)如果一个结构里有某些结构体成员,则结构体成员必须从其内部最大元素大小的整数倍地址开始存储

4.如何写结构体最节省空间呢?

按照数据类型从小到大的顺序进行书写

5.练习(在默认对齐是8B的前提下)

struct Struct1
{
	char c;
	double i;
};
c 0 0 0 0 0 0 0 i i i i i i i i
长度为:16B
struct Struct2
{
	char c1;
	Struct1 s;
	char c2;
	char c3;
};
c1 0 0 0 0 0 0 0 
c  0 0 0 0 0 0 0
i  i i i i i i i
c2 c3 0 0 0 0 0 0
长度为:32B
struct S4
{
	int c;
	char b[10];
};
cccc bbbb
bbbb bb00
长度为:16B
struct Struct2
{
	char a;
	S4 s;
	char d;
};
a000 cccc
bbbb bbbb
bb00 d000
长度为:24B

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tntlbb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值