结构体内存对齐规则

✨前言✨

📘 博客主页:to Keep博客主页
🙆欢迎关注,👍点赞,📝留言评论
⏳首发时间:2023年10月20日
📨 博主码云地址:博主码云地址
📕参考书籍:《C++ Primer》《C++编程规范》
📢编程练习:牛客网+力扣网
由于博主目前也是处于一个学习的状态,如有讲的不对的地方,请一定联系我予以改正!!

偏移量

首先我们先来看这样的一段代码

struct test1 {

	char i;
	char a;
	double c;

};

struct test2 {
	
	char c;
	double a;
	char b;
	
};

int main()
{
	printf("%d ",sizeof(struct test1));
	printf("%d ", sizeof(struct test2));
	return 0;
}

你认为结构体test1与test2的大小会一样吗?下面给出运行结果:
在这里插入图片描述
可以发现,test1与test2中的变量类型是一样的,为啥大小就不一样了呢?其实在结构体存储中是按照一定规则进行存储的,并不是连续进行存储的!它们的存储是根据偏移量以及对齐数来进行存储的!!!
偏移量:我们以结构体存储的位置作为参考点(标记作为0位置开始),之后的地址距离这个参考点的距离我们称之为偏移量!

偏移量的计算

首先我们需要包含头文件

#include <stddef.h>

代码如下:

struct test2 {
	
	char c;
	double a;
	char b;
	
};


int main()
{
	printf("%d ", offsetof(struct test2, a));
	return 0;
}

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

注:第一个参数是结构体,第二个参数是结构体里面的变量

存储规定

规定:
1 结构体中的第一个变量存储位置的偏移量为0,之后在进行类型存储
2 从第二个变量开始,我们取该类型的对齐数(该类型的大小和编译器中的默认对齐数中取最小
的那个),然后从偏移量是最小对齐数的倍数的位置开始存放数据!
3 所有变量存储完毕之后,所占的字节数必须是各个变量中的那个对齐数中最大的那个数的倍数!

注:在vs中给出对齐数是8,gcc环境下的对齐数就是类型的大小!我们以vs为例!
图解test1:
在这里插入图片描述
图解test2:
在这里插入图片描述

嵌套结构体

结合上文,我们再来看这样一段代码:

struct test3 {
	char a;
	struct test1;
	int x;
};

int main()
{
	printf("%d\n", sizeof(struct test3));
	return 0;
}

这段代码的运行结果又是多少呢?
运行结果如下:
在这里插入图片描述

图解如下:
在这里插入图片描述

大小端存储

我们是以字节为单位,讨论数据在内存中的存储顺序!
在这里插入图片描述
由计算机中数据的存储方式我们知道(以补码的形式来存储),dd是低字节的内容:
在这里插入图片描述
由此我们可以得出大小端村粗方式的定义:
大端存储方式:高字节的内容放到低地址处我们称为大端存储序,反之,则为小端存储序!
如何判断一个机器是大端存储还是小端村粗呢?可以参考以下代码的编写:

int main()
{
	int x = 1;
	char* p = (char*)&x;
	printf("%d", *p);
	return 0;
}

如果p打印出来是1,说明是小端否则为大端,这里主要截取了x中的一个字节进行判断即可!

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

to Keep

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

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

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

打赏作者

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

抵扣说明:

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

余额充值