zoukankan      html  css  js  c++  java
  • C struct结构体内存对齐问题

          在空间看到别人的疑问引起了我的兴趣,刚好是我感兴趣的话题,就写一下。为了别人的疑问,也发表在qq空间里。因为下班比较晚,10点才到家,发表的也晚。其实是个简单的问题。 
    图片

    直接用实例和内存图说明:

    #include <iostream>
     
    using std::cout;
    using std::cin;
     
    struct  stu
    {
        char sex;
        int length;
        char name[10];
    };
     
    void main()
    {
        stu stu0;
        stu0.sex = 'f';
        stu0.length = 1;
        stu0.name[0] = 'a';
        stu0.name[1] = 'b';
        stu0.name[2] = 'c';
        stu0.name[3] = 'd';
        stu0.name[4] = 'e';
        stu0.name[5] = 'f';
        stu0.name[6] = 'g';
        stu0.name[7] = 'h';
        stu0.name[8] = 'i';
        stu0.name[9] = 'j';
     
        int size = sizeof(stu0);
        stu *p_stu = &stu0;
        cout << size;
        cin.get();
    }

    结果为:20字节。 显然是有内存对齐的过程。 

    在vs下设置断点,切换反汇编,之后通过指针看到struct的内存位置,再去查看vs提供的内存查看器:
    与程序内容相对应,可以清晰看到内存怎么分布的。
    前四字节存储char型-66,之后四字节存储int型01然后10字节是char数组,后面补齐2字节,共20字节。显然,这里内存补齐的单位是 - 4
    图片 
    上面是以4为单位补齐,因为最大的是int型,四字节。

    再看下面的例子: 
    #include <iostream>
     
    using std::cout;
    using std::cin;
     
    struct  stu
    {
        char sex;
        double length;
        char name[10];
    };
     
    void main()
    {
        stu stu0;
        stu0.sex = 'f';
        stu0.length = 1.1;
        stu0.name[0] = 'a';
        stu0.name[1] = 'b';
        stu0.name[2] = 'c';
        stu0.name[3] = 'd';
        stu0.name[4] = 'e';
        stu0.name[5] = 'f';
        stu0.name[6] = 'g';
        stu0.name[7] = 'h';
        stu0.name[8] = 'i';
        stu0.name[9] = 'j';
     
        int size = sizeof(stu0);
        stu *p_stu = &stu0;
        cout << size;
        cin.get();
    }

    结果为32。
    说明是以8(double)为单位补齐 ,第一个char补为8位,第二个double8位,之后char数组10位,后面补6位。共32位。

     图片

    所以,总结下,struct内存补齐机制,就是以最大的数据类型为单位来补齐。数组是连续存储在一段空间的。
    知道上面我总结的一点,结合vs内存图,就会算,struct内存大小了。

    你会发现,我文章一直纠结以什么单位来内存补齐。
    因为这个单位是最关键的问题。
    找到了内存补齐的单位,就自然会计算了。

    我也就是通过小实验验证了单位为,struct中最大数据类型这一观点。

    至于为什么要作内存补齐,当然是编译器为了方便cpu寻址而做的优化。如果不内存补齐,xxxxxxx(中间省略几千字)寻址会有多麻烦你知道吗?
     

  • 相关阅读:
    求助,eclipse总是卡在building workspace-CSDN论坛
    java.lang.NoSuchMethodError: org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar
    Oracle修改默认字符编码
    mysql修改数据库编码(数据库字符集)和表的字符编码的方法
    如何把maven项目转成web项目
    解决Cannot change version of project facet Dynamic Web M
    YII 框架查询
    SpringBoot项目如何进行打包部署
    Java并发—— 关键字volatile解析
    牛客网刷题(纯java题型 31~60题)
  • 原文地址:https://www.cnblogs.com/rixiang/p/5582539.html
Copyright © 2011-2022 走看看