位域的sizeof

使用位域的主要目的是压缩存储,其大致规则为:

1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;

2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;

3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;

4) 如果位域字段之间穿插着非位域字段,则不进行压缩;

5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。

 

注意:1.相邻位域字段类型相同的,看位宽之和;2.相邻位域字段类型不同的,看是否压缩;

        3.整个结构体总大小为最宽基本类型整数倍。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

#include <iostream>
using namespace std;
 
int main()
{
    struct test1
    {
        char a:1;
        char b:2;
        char c:7;
    };
    cout << sizeof(test1) << endl;//vc:2,gcc:2;
/*test1
*a b类型相同,位数和为3,所以存放在一个字节中(规则1);
*该字节剩余5位不足以存放cc存于新的字节中(规则2),所以test12字节。
*/
 
    struct test2
    {
        char a:1;
        short b:2;
        char c:2;
    };
    cout << sizeof(test2) << endl;//vc66gcc2.
/*test2
* vc6不压缩:a存于第一个字节,b存于第三个字节!(short 2字节要能够整除起始地址)占2字节,
*         c存于第4字节,一共5字节,对齐后6字节。
* gcc压缩:1字节,根据规则5short两字节,对齐后2字节。
**/
 
    struct test3
    {
        char a :1;
        char b :2;
        long c :3;
        char d :2;
    };
    cout << sizeof(test3) << endl;//vc612,gcc:4.
 
    return 0;
}
原文地址:https://www.cnblogs.com/helloweworld/p/3177366.html