利用结构体的内存对齐规则 计算结构体在程序中所占内存的大小

一   简介

首先下面两个结构体,所含三个类型均一致只是排序不同。但所占内存却不一样,要知道为什么我们就需要了解结构体的内存对齐规则。

二  offsetof

为了探究结构体的对齐规则

我们用 offsetof 辅助研究,下图是官方给出的使用方法(绿色字体)及作用介绍;

offsetof,该宏用于求结构体中一个成员在该结构体中的偏移量。

offsetof( type ,  member  );
第一个参数 type 是结构体的名字,第二个参数 member 是结构体成员的名字。该宏返回成员member 在结构体中的内存偏移量。偏移量是size_t类型的。

第一个成员偏移量统一从0开始

例:
#include <stddef.h>
#include <stdio.h>

struct address {
char c1;
char c2;
int i;
}ddc;

int main()
{
printf(“address 结构中的 c1 偏移 = %d 字节。\n”,
offsetof(struct address, c1));

printf(“address 结构中的 c2 偏移 = %d 字节。\n”,
offsetof(struct address, c2));

printf(“address 结构中的 i 偏移 = %d 字节。\n”,
offsetof(struct address, i));

return(0);
}

运行结果:
address 结构中的 c1 偏移 = 0 字节。
address 结构中的 c2 偏移 = 1 字节。
address 结构中的 i 偏移 = 4 字节。


三 对齐规则


1    第一个成员偏移量统一从0开始 
2   从第二个元素开始,需要放在 该类型的大小 的 整数倍 上(c2类型大小为1,1字节位是1的倍数所以可以放置在1的位置上)

3   从第三个元素也一样(只要不是第一位成员),需要放在 该类型的大小 的 整数倍 上(i类型大小为4,前面两个元素后面的2/3字节都不是4的倍数,直至第4个字节位是4的倍数所以可以放置在4的位置上)
4   最后所占大小还要取决于结构体中最大数据类型的整数倍,在上面最大的数据类型为int(4字节),最后一个元素 i 从4字节开始放置至7结束。0~7字节占了8个字节,刚好是最大的数据类型int
(4字节)的倍数所以sizeof(ddc) = 8;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值