• 结构体内存对齐规则


    ✨前言✨

    📘 博客主页: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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

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

    偏移量的计算

    首先我们需要包含头文件

    #include

    代码如下:

    struct test2 {
    	
    	char c;
    	double a;
    	char b;
    	
    };
    
    
    int main()
    {
    	printf("%d ", offsetof(struct test2, a));
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

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

    存储规定

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

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

    嵌套结构体

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

    struct test3 {
    	char a;
    	struct test1;
    	int x;
    };
    
    int main()
    {
    	printf("%d\n", sizeof(struct test3));
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

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

    大小端存储

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

    int main()
    {
    	int x = 1;
    	char* p = (char*)&x;
    	printf("%d", *p);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

  • 相关阅读:
    动态规划算法:背包问题
    周期性触发的自定义触发器
    范式,ground truth
    Java 注解及其底层原理
    Pagination 分页
    【python基础】python类的成员变量与成员函数的一些疑问
    限流算法:时间窗口,令牌桶与漏桶算法对比
    神经网络 | 深度学习背后的数学
    用Java实现扑克牌游戏——简易炸金花
    【重要公告】BSV区块链上线TypeScript SDK,未来将支持更多开发语言
  • 原文地址:https://blog.csdn.net/qq_57107826/article/details/133950932