结构体字节对齐

1、32位机

char 占1字节

        short 占2字节

        int    占4字节

        long  占4字节

float   占4字节

double 占8字节

        long long 占8字节


2、结构体的对齐值N:各成员中占最大字节者字节数与用 #pragma pack(value) 的value 两者中的小者,若未用 #pragma pack(value)指定,则为成员占最大字节值。

3、成员对齐值M:成员所占字节数与N中的小者

4、最终结构体所占字节数为N的倍数


成员对齐:假设结构体的起始地址为0,各成员的偏移地址为M的倍数

结构体对齐:所占总字节数为N的倍数


若结构体中嵌套有结构体,N的默认值由结构体中各“原子类型”所占字节数确定。




位域对齐:

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位(一个字节8个二进制位)。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
注意:一个位域必须存储在同一个字节中,不能跨字节。一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。(从这里也能看出一个位域不能超过8)。
4.含位域结构体内存对齐:
a. 如果相邻位域类型相同,位宽之和小于类型的sizeof大小,则后面的字段紧邻前一个字段存储,直到不能容纳为止;
b. 如果相邻位域类型相同,位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
c. 如果相邻位域类型不用,则vc6采取不压缩方式,dev-c++ 和GCC都采取压缩方式。
5. 非压缩存储:
  struct T0
    {
        char c:2;
        int i:1;
    };
    cout << "struct T0{ char c:2; int i:1;} = " << sizeof(T0) << endl; //dev c++:4  vc6:8
依然要满足不含位域结构体内存对齐准则第2条,i成员相对于结构体首地址的偏移应该是4的整数倍,所以c成员后要填充3个字节,然后再开辟4个字节的空间作为int型,其中4位用来存放i,所以上面结构体在VC中所占空间为8个字节;而对于采用压缩方式的编译器来说,遵循不含位域结构体内存对齐准则第2条,不同的是,如果填充的3个字节能容纳后面成员的位,则压缩到填充字节中,不能容纳,则要单独开辟空间,所以上面结构体T0在GCC或者Dev-C++中所占空间应该是4个字节。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值