sizeof(struct{bit-field})——包含位域的结构体的空间大小

本文深入探讨了包含位域的结构体在内存分配中的处理方式,通过VC和Dev-C++两个编译器的实例分析,展示了位域大小的影响以及内存对齐规则。位域大小在不同编译器下有区别,如VC中位域大小受限,而Dev-C++则允许超出类型大小。同时,文章揭示了位域在内存中的排列特点,以及结构体成员的地址分布。

原文:sizeof(struct)

原文地址:http://blog.sina.com.cn/s/blog_913c070a0100zq3m.html

一般情况下,编译器会把struct中的成员作对齐处理,所以sizeof后不是等于所以成员大小之和。
VC编译器做对齐处理的步骤如下(原作者理解):
1、首先获得struct中的大小最大的基本数据类型成员的大小,称为内存分配基大小(以下简称:基大小),这里的最大成员为double d1,d1的大小为8,所以基大小为8;
2、按照顺序为struct中的成员分配内存:
(1)、分配一个大小等于基大小的内存;
(2)、从第一个到最后一个成员,取得每个成员的大小为N,调整可插入内存起始地址,使得(可插入内存起始地址 - struct起始地址) 为N的倍数(向后移调整),从可插入内存起始地址 开始插入成员,如果分配的剩余空间大于这个成员的大小,则把struct的成员插进内存中,否则执行(1)。直到把所有成员插完为止。
3、此时struct的大小应该为基大小的倍数。
例如,
struct s{
    double d1;
    int d2;
    char d3;char d4;
};
内存分配情况如下:

8(double)+ 8(int+char+char=6)= 16


我把笔试原题深化一下,测试了一些原文没写到的地方(位域bit-field),过程如下:


首先是编译器关于位域大小的区别,VC中位域大小不能大于类型大小,而Dev-C++中可以。

即 int i1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值