结构体的内存对齐规则

结构体的内存

一、对齐规则

1.数据成员对齐规则:结构(struct或联合union)的数据成员,第一个成员在与结构体变量偏移量为0的地址处,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。

2.结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

3.结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)

二、例子

列子1:

struct test1{
	int num1; //4
	char ch;  //1 内存大小是否按1算
	int num2; //4
}

内存分析

内存分析

分析:

1. 第一个是int类型,后面每个数据成员存储的起始位置要从该成员大小的整数倍开始算(也就是4的倍数,故char ch 的起始位置是4,int num2的起始位置是8)。
2.char ch只占一个内存,需要补齐三个。
3.判断当前总内存(12)是否是最大成员内存(4)的整数倍,如果不是需要补齐到最大成员内存的整数倍。

列子2:

struct test2{
	char num1; //1
	char num2; //1
	double num3;  //8
	//总大小为2+8?
}

内存分析在这里插入图片描述

分析:

1. 第一个是char类型,后面每个数据成员存储的起始位置要从该成员大小的整数倍开始算(也就是1的倍数,故char num2 的起始位置是1,double num3的起始位置是2)。
2.判断当前总内存(10)是否是最大成员内存(8)的整数倍,如果不是需要补齐到满足最大成员内存的最小整数倍(2倍,16)。
3.故double num3的起始位置修改为8,char num1,char num2,补齐到8个内存,故结构体所占内存为16。

列子3:

struct test3{
	char num1; //1
	double num3;  //8
	char num2; //1
	//总大小为2+8?
}

内存分析

在这里插入图片描述

分析:

1.当前总内存要是最大成员内存的整数倍,故char num1要补7个。
2.char num2同样要补7个,故结构体的内存为24。

列子4:

struct S1 {
        double a;// 8
        char b;  // 1
        int c;   // 4
    };
    struct S2 {
        char num; // 1
        S1 s;     // 16
        double d; // 8
    };
}

分析:

1.struct S1的内存为16(char b,int c一起补齐8个,共补3个)。
2.S2中嵌套结构体S1(结构体成员要从其内部最大元素大小的整数倍地址开始存储),当前S1中最大元素大小为8,S2中double也是8,故S2最大对齐数是8的倍数
3. char num补齐到8,结构体的总内存为(8+16+8=32)
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值