zoukankan      html  css  js  c++  java
  • C语言结构体在内存中的存储情况探究------内存对齐


    条件(先看一下各个基本类型都占几个字节):

    void size_(){
        printf("char类型:%d
    ", sizeof(char));
        printf("int类型:%d
    ", sizeof(int));
        printf("float类型:%d
    ", sizeof(float));
        printf("double类型:%d
    ", sizeof(double));
        return;
    }

     结果:


    先来一下, 这个结构体在内存中占有多少个字节的内存呢?

    typedef struct mystruct{  /*结构1*/
        int i_int;
        char c_char;
        char s_char[9];
    }MYSTRUCT;

    这个呢(交换数据成员顺序)?

    typedef struct mystruct{   /*结构体2*/
        char c_char;
        int i_int;
        char s_char[9];
    }MYSTRUCT;

    现在让它自己告诉我们

    int main()
    {
        MYSTRUCT my_st = {0};
        int size_struct = sizeof(my_st);
        printf("%d
    ", (int)&my_st.i_int);
        printf("%d
    ", (int)&my_st.c_char);
        printf("%d
    ", (int)my_st.s_char);
        printf("占用内存大小:%d 个字节
    ", size_struct);
    
        return 0;
    }

    首先看结构体1的结果

    可以看出:int占有4个字节, char占有了1个字节, 那么后面char类型的数组占有了11个字节

    这是什么鬼?明明定义了char数组长度为9为什么会是11

    别着急继续向下看

    查看结构体2的结果(难道不是16?)

    哈哈, 竟然又出来个20


    揭晓答案

    这是因为结构体的存储存在内存对齐机制,也就是  < 结构体大小能被最宽基本类型成员大小所整除 >

    基本类型指的是 char  int  double 等,这样的对齐机制使得寻址更加方便


    为什么结构体1占有16个字节

    因为单个char成员会与其下面的char类型数组组合在一起  也就是相当于一个char类型的长度为10的数组

    其中最宽基本类型为 int  占4个字节  而后面的 ”char[10]“数组要满足是int占有4个字节的整数倍最小的就是12, 所以共16个字节


    为什么结构体2占有20个字节

    第一个成员为char单个字符, 其后面是一个int类型,不能结合故要给char分配4个字节

    后面的char数组当然还要分配12个字节, 所以4+4+12=20个字节


    了解了对齐机制后再来分析一个

    typedef struct mystruct{   /*结构体3*/
        char c_char;
        double d_double;
        int i_int;
        char s_char[9];
    }MYSTRUCT;

    分析

    最宽基本类型是 double 占有8个字节----------------------------------------------------------------8

    第一个char占有1个, 但是要补齐为8个字节---------------------------------------------------------8

    后面的int占有4个,相当于4个char类型,与char数组结合为 ”char[4+9]“ , 要补齐为16个字节----16

    得到结果-------------------------------------------------------------------------------------------32

    验证一下

    果然就是这样


    本节完......

  • 相关阅读:
    Dart回顾——单线程模型
    Dart回顾——var 、dynamic 、Object 区分及final、const、static关键字
    java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/camera/core/CameraFactory
    iOS10以上打包只有arm64 clang: error: invalid iOS deployment version '--target=armv7-apple-ios11.0', iOS 10 is the maximum deployment target for 32-bit targets [-Winvalid-ios-deployment-target]
    Mac flutter env: bash : No such file or directory
    Mac 设置默认 Shell
    flutter Operation not permitted
    读取本地json文件,并转换为dictionary
    UITextField只能输入数字NSCharacterSet实现
    rangeOfString 和 containsString 兼容iOS7处理
  • 原文地址:https://www.cnblogs.com/xinglichao/p/9189922.html
Copyright © 2011-2022 走看看