内存对齐全攻略--二、涉及位域的内…

本文详细解析了在VC++6.0环境下位域内存对齐的规则,并通过具体实例展示了如何根据这些规则进行内存分配。包括位域字段类型相同时的连续存储原则及不同类型时的独立存储规则。

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

二、涉及位域的内存对齐
注:由于能力有限,在此仅讨论在VC++6.0编译环境下的情况,对于其他编译环境下的情况,由于没有硬件支持,只能作罢,但会将查到的相关知识贴在最后,但不做讨论。
涉及位域的内存对齐规则(规则太枯燥,如果不想看就看例子啦,呵呵) 如下,后用代码分析验证:
1) 若相邻成员变量类型相同,且其位宽之和不大于成员变量类型位宽(在此严重强调,是 类型位宽 而不是成员变量sizeof,也不是类型的sizeof或者其他什么)大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和不大于成员变量的类型宽度大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,不同位域字段存放在不同的位域类型字节中;(这一条其实会根据编译器的不同而采用不同的规则,此处以VC++6.0标准来说明)
4)其实不存在4),这一条是说,在此,还要遵守不涉及位域的2),3)条规则,也部分遵守不涉及位域的第一条规则
实例分析,代码如下:


 1#include <iostream>
 2using namespace std;
 3struct A
 4{
    char c1:4;
    char c2:4;
    short s1:4;
    short s2:8;
    int i;
10};
11int main ()
12{
13    A a;
14    a.c1=1;a.c2=2;a.s1=3;a.s2=4;a.i=5;
15    printf("sizeof(A)=%d\n",sizeof(A));
16    return 0;
17}
将一步一步来分析内存情况:
1、从起始地址(假设为零)为c1分配空间,如下图:

内存对齐全攻略--二、涉及位域的内存对齐

2、接下来,为c2分配空间,由于c1和c2的类型都为char,且c1和c2的位宽之和为8不大于类型char的位宽8,根据规则1,c2的空间分配如下:

内存对齐全攻略--二、涉及位域的内存对齐
3、接下来,为s1分配空间,此时,有一个问题,s1的内存空间的起始地址是从哪儿开始呢?1还是2?根据上一节介绍的我们可知,s1的对齐模数为2,此处上一节的规则规则依然适用,结合这里的第三条,1处,填充CC,从2处开始分配:

内存对齐全攻略--二、涉及位域的内存对齐

4、接下来,为s2分配空间,重复第二步,非配如下(此处也要注意一下的,因为一个s2的空间非配跨越了两个字节,而且都不是完整的占有一个字节):

内存对齐全攻略--二、涉及位域的内存对齐

5、接下来为i分配内存空间便如同上一节讲的一样了,如下图:

内存对齐全攻略--二、涉及位域的内存对齐
6、我们看最终的内存空间分配结果:

内存对齐全攻略--二、涉及位域的内存对齐

7、最终的运行结果,也与分析一致:

内存对齐全攻略--二、涉及位域的内存对齐
呵呵,如果上边的你都看懂了,何不做做下边的这个小练习呢?看看你能做对不~
代码
 1 #include <iostream>

2 using namespace std;

3 struct A

4 { 

    char c1:1; 

    char c2:3;

    unsigned short s2:13;

    unsigned long i:3;

9 };

10 int main ()

11 {

12     A a;

13     a.c1=1;

14     a.c2=2;

15     a.s2=4121;

16     a.i=5;

17     printf("sizeof(A)=%d\n",sizeof(a));

18     return 0;

19 }

这是结果:

内存对齐全攻略--二、涉及位域的内存对齐

原文来自:雨枫技术教程网 http://www.fengfly.com
原文网址:http://www.fengfly.com/plus/view-173130-1.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值