• 结构体(类)位制


    若静态变量 static int i; 是全局变量,则 sizeof(i) = 4; //存储在静态区

    若静态变量存在于结构体或类中,则sizeof(A) = 1;//静态变量也存储于静态区,结构体的大小只计算非静态变量。

           对空类或结构体,使用sizeof会返回1;//因为,如果类或结构体占用内存为0话,无法实例化并区分,故编译器为了使空类能够实例化分配了1Byte。

    struct A 
    {       
        static int i;    
    };
    
    int A::i = 1;

    如果类中存在虚函数的话,类的大小增加一个指向虚函数表的指针的大小。

    结构体位制

    当数据存储不需要占用完整的一个字节,只需要几位或者一位二进制位的时候,为了节省空间,C语言提出的一种数据结构,称“位域”或者“位段”。位域即把一个字节按位划分成区域。

    经测试,发现结构体位制以下特点:

    1. 位域的成员可以是char、short、int、unsigned类型。

    2.命名的位域位宽不能为0,长度为0的位域不能指定名字,否则编译出错。

    3.长度为0的位域的作用是使下一个成员从下一个存储单位(大小与定义位域的类型有关)开始存放;

    4.位域之外的其他内存的值并不受到改变;0位域没有使定义位域外的值赋为0。(gcc/vc6.0编译的结果)

    例如以下程序:

    image

    初始内存分布情况:从0x22ff68出开始,

    image

    内存变化情况如下:

    image

    结果为:

    image

  • 相关阅读:
    Nuxt.js 踩坑记录(2) 使用sequelize时,提示install mysql2,安装了仍然不能解决问题
    Nuxt.js 踩坑记录,(1)引入fs包报错
    JS手写call、bind、apply
    手写Promise简易版
    generator函数
    ["1","2","3"].map(parseInt)结果
    改变对象转换为原始值的方式
    instanceof判断问题
    e.target和e.currentTarget区别
    java设计模式--适配器模式
  • 原文地址:https://www.cnblogs.com/baiweiguo/p/3010326.html
Copyright © 2020-2023  润新知