简单介绍C/C++中结构体内存对齐

本文详细解析了C语言中结构体的内存对齐规则,包括如何计算结构体的实际大小,以及不同成员变量顺序对结构体大小的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C中结构体的内存规则并不是直接其属性的内存直接相加的,而是有一定规则的,也就是内存对齐规则;

一:结构体中第一个成员的偏移量是0,以后每个成员的位置是x的倍数;//x是各个属性的内存大小

二:成员对齐后,结构体自身也要对齐,按照y的倍数进行;//y是内存最大的属性的内存
比如:
struct m1{
    char a;
    int c;
    double d;
}m1;
cout << sizeof(char) << " " << sizeof(int) << " " << sizeof(double) << endl;
//结果是1 4 8;
可是
cout << sizeof(m1)//结果是16  
再比如
struct m2{
    int c;
    double d;
    char a;
   
}m2;

cout <<  sizeof(m2);//结果是24

可以看到结构体的内存大小并不一定等于其属性的内存大小的和,就算属性相同先后次序不同,其结构体大小也可能会不同,这就是因为内存对齐这一机制。

结构体m1中a占1个字节,假设从地址0开始,则c本来会从地址1开始,可是c占4个字节,起始地址不是4的倍数,内存就会把起始地址往后移,也就是说移到地址4后,是4的倍数了,才开始存储c,同理d也是如此;

结构体m2中c占4个字节,假设地址也从0开始,则d会从4开始,可是4不是8的倍数,则移到8开始到地址15,然后a从16开始到地址17,但是17不是结构体属性中最大的属性double内存大小的倍数,所以加到24.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值