zoukankan      html  css  js  c++  java
  • C语言各类型大小,结构体大小 sizeof(struct A)

    C语言类型大小总览

    • 编译器pack指令 #pragma pack(n)——定义n字节对齐
    • C++固有类型的对齐取编译器对齐与自身大小中较小的一个
    • 32位C++默认8字节对齐。gcc编译器默认4字节对齐
    • static变量在静态区,sizeof均不纳入计算
    • 在编译阶段处理,sizeof作用范围内的内容不能被编译,所以sizeof()内的运算不被执行
    • sizeof(函数)=sizeof(返回值类型)
    • sizeof和strlen:sizeof计算字符串容量,算’’,strlen计算字符串长度,到’’截止
    • 类:非static数据成员变量+虚函数指针+对齐;无论多少个虚函数,都只有一个指向虚函数表的指针(4字节)
    • 联合体:最长成员的大小对齐
    • 带位域:相邻位域字段的两个变量若类型相同,当两个字段位宽和小于此类型大小时,二者紧邻存储;若二者位宽和大于本类型大小,则第二个字段从新存储单元开始,偏移量为其类型大小整数倍。若相邻位域字段类型不同,则视编译器决定是否压缩存储,VC6不压缩,Dec-C++压缩。如果位域字段间穿插着非位域字段,不压缩。
    • 数组:数组占内存字节=元素个数*元素长度; 当数组作为函数参数传递时,蜕变成指针

    32/64 位系统各类型对照表:

    字节

    short

    int

    float

    long

    *(地址)

    double

    long long

    32位

    2

    4

    4

    4

    4

    8

    8

    64位

    2

    4

    4

    8

    8

    8

    8


    *有无unsigned修饰都一样

    结构体大小

     约定为32位系统,即char 1字节、short 2字节、int 4字节


    该问题总结为两条规律:
    1,每个结构体成员的起始地址为该成员大小的整数倍,即int型成员的其实地址只能为0、4、8等

    2,结构体的大小为其中最大成员大小的整数倍

    struct A{
        char a;        //1
        int b;        //空3 + 4 = 7 (规则1)
        short c;    //2+空2=4 (规则2)
    };
    struct B{
        char a;        //1
        short b;    //空1 + 2 = 3 (规则1)
        int c;        //4
    };

    结果是:

    sizeof(A)=12
    sizeof(B)=8

    如果指定了对齐值

    #pragma pack(1)
    struct A{
        char a; //1
        int b;//4
        short c;//2
    };
    #pragma pack(1)
    struct B{
        char a;//1
        short b;//4
        int c;//2
    };

    结果是:

    sizeof(A)=7
    sizeof(B)=7

    参考:

    https://blog.csdn.net/EVEcho/article/details/81115683

    https://blog.csdn.net/radianceblau/article/details/60867307

  • 相关阅读:
    Java程序开发必备的6种知识
    Java技术在多数据库系统中的应用研究
    解决J2EE系统应用性能问题常用方法
    在Java中如何跳出当前的多重嵌套循环?
    Java学习是由简入难的学习过程
    浅谈Java SE、Java EE、Java ME三者的区别
    J2ee的学习方法及步骤摘要
    IOS 使用GCD改善性能
    IOS Cell重用机制
    BUG--tomcat更改目录失败
  • 原文地址:https://www.cnblogs.com/jins-note/p/10211158.html
Copyright © 2011-2022 走看看