• sizeof的用法与字节对齐


    一、sizeof是什么?

      sizeof是一种预编译处理,不是函数,不是一元表达式。也即,作用阶段在编译期。

    二、功能是什么?

      sizeof返回变量或类型的字节数。

    三、调用方式

      sizeof(object):对对象使用
      sizeof(typename):对类型使用

    四、返回值情况归类

      其实质是考察各个类型所占内存的相关知识

      基本数据类型:
        char(unsigned) 1
        short(unsigned) 2
        int(unsigned) long float 4
        double 8
      函数:
        返回值的类型
      指针:
        32位系统 4
        64位系统 8
      数组:
        数组的实际大小

    五、重点:对齐问题下的sizeof
      各类型对界与其字节数一致。也即起始地址需要被对界整除。
      另外,对于复合数据类型,如union、struct、class,类型字节数是成员最大对界的整数倍。

      sizeof(union)
        基本大小由最大的元素决定,但最终大小为最大对界的整数倍
        

    union u1
    {
        double a;
        int b;
    }; // 8
    
    union u2
    {
        char a[13];
        char b;
    }; // 13
    
    union u3
    {
        char a[13];
        int b;
    }; // 16,int类型的对界为4

      sizeof(class)
        包含虚函数的类,保存了指向虚函数表的指针,而一个指针为4个字节。

      sizeof(struct) 略微复杂
        struct类型的对界为成员中的最大对界,也即struct类型的字节数是对界的整数倍,同时起始地址也是对界的整数倍。

    struct nalign
    {
        //基本成员类型
        char a; //起始地址:0 占空空间:1
        int b; //起始地址:4 占用空间:4
        short c; //起始地址:8 占用空间:2
        //总空间为10
        //struct为4对界 总空间补全到12
    };
    
    struct nalign1
    {
        //struct类型作为成员的情形
        //
        char a; //对界:1 起始地址:0 占用空间:1
        nalign b; //对界:4 起始地址:4 占用空间 12
        //总空间为16
        //struct为对界4 总空间补全到16
    };
    
    int main(int argc, char **argv)
    {
        cout << sizeof(nalign) << endl; // 输出"12"
        cout << sizeof(nalign1) << endl; //输出"16"
    }

      总结:
        在复合类型中,成员变量的对界为成员起始地址的整数倍;复合类型的对界为成员变量的最大对界;复合类型的大小为其对界的整数倍。

  • 相关阅读:
    Asp.net Treeview 客户端选中效果实现 (初级)
    MYSQL生成日历表,通常在做报表的时候需要用来生成一个临时表,用来左连接等。
    写了一个抽奖类,感觉还不错,可以适合各种变化
    将系统的内部类:HttpValueCollection 移到自己的系统中,使其能方便的解析id=1&name=张三&sex=男这样的字符串参数 querystring
    指定某个文件的创建 修改 访问时间
    Reqeust["keyname"] 的读取顺序
    pku1463 Strategic game
    pku1947 Rebuilding Roads
    pku1848 Tree
    pku1056 IMMEDIATE DECODABILITY
  • 原文地址:https://www.cnblogs.com/zjgtan/p/3834783.html
Copyright © 2020-2023  润新知