zoukankan      html  css  js  c++  java
  • 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"
    }

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

  • 相关阅读:
    Django 用ModelForm批量保存form表单(非常实用的方法) mfor_verity项目
    jquery ajax异步提交表单数据的方法
    python字符串转换成变量的几种方法
    django 线上线下使用不同的数据库 上线:mysql 线下sqlite3 以及debug模式的开和关
    django admin 或xdmin list_display search_fields list_filter 如果显示搜索外键或多对多字段
    nonce和timestamp在Http安全协议中的作用
    Web API接口 安全验证
    .Net环境下的缓存技术介绍
    .Net缓存管理框架CacheManager
    在asp.net web api中利用过滤器设置输出缓存
  • 原文地址:https://www.cnblogs.com/zjgtan/p/3834783.html
Copyright © 2011-2022 走看看