zoukankan      html  css  js  c++  java
  • 位域的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;
    }
  • 相关阅读:
    分布式锁设计方案
    ACID/CAP/BASE 理论知识
    分布式ID设计方案
    perl代码调试
    文档型数据库设计模式-如何存储树形数据 [转]
    树形结构的数据库表Schema设计
    http协议相关
    HTTPS加密原理(转)
    VBA读写XML文件
    VBA 刷新数据透视表
  • 原文地址:https://www.cnblogs.com/helloweworld/p/3177366.html
Copyright © 2011-2022 走看看