zoukankan      html  css  js  c++  java
  • 结构体所占内存大小

    结构体所占内存大小划分原则:

    1、划分字节,按照当前结构体中,字节数最大的类型作为划分单元。【这里面还有一些前提。下面的例子会详细说到】

    2、以矩形块儿的形式划分。

    #include <stdio.h>

    /**划分示意图:

    最小单元是 double所以 这个 地方按照8个字节作为最小单元来划分。

    */

    struct student1
    {
      double avgMark;
      int ID;
    };

    /**划分示意图:

    最小单元不能是数组这个地方的最小单元是 1个字节

    */

    struct student2{
      char name[5];
      char id[2];
    };

    /**划分示意图:

    数组不作为划分单元,所以最小划分单位是int 4个字节。

    */

    struct student3{
      int ID;
      char name[10];
    };

    /**划分示意图:

    30个格格就不画了。但是可以很明显的知道,划分单元是4个字节。这样name部分会浪费两个字节,所以它的占地面积是36个字节。

    */

    struct BaseInfo{
      char name[30];
      int age;
    };

    /**划分示意图:

     

    这个 划分就格外有说法了,划分单元到底取4还是取36.C语言作为一门经久不衰的语言,想想也不可能是36,要是BaseInfo里面写一个char name[100],那一个student4就会浪费100个字节。这太可怕了。这就是它把每一个结构体都要细分的原因,方便这个结构体融入到别的别的结构体中。

     

    */

    struct student4{
      int ID;
      struct BaseInfo baseInfo;
    };

    /**划分示意图:

     

    也不画了,char a会浪费3个字节,char c会浪费3个字节,一共占地面积是12个字节。

     

    */

     

    struct test1{
      char a;
      int b;
      char c;
    };

    /**划分示意图:

    ac共享一行,然后浪费两个字节,

    Int单独占一行,所以总共的占地面积是8个字节。

    */

    struct test2{
      char a;
      char c;
      int b;
    };
    
    int main(){
    
    printf("sizeof(struct student1) = %d
    ", sizeof(struct student1));//这个案例在开始看视频的时候,就想写了,毕竟double占8个字节。16
    printf("sizeof(struct student2) = %d
    ", sizeof(struct student2));//7
    printf("sizeof(struct student3) = %d
    ", sizeof(struct student3));//16
    printf("sizeof(struct student5) = %d
    ", sizeof(struct student4));//40
    printf("sizeof(struct test1) = %d
    ", sizeof(struct test1));//12
    printf("sizeof(struct test2) = %d
    ", sizeof(struct test2));//8
    getchar();
    return 0;
    }
    
    后面这部分是想着想着觉得不对劲,补进来的:
    
    struct test3{
      
    double a;
    };
    struct test4{
      
    struct test3 t3;   char a; };

    试试test4的占地面积吧~~~还蛮好玩的。

    附运行结果:

     

     

     

  • 相关阅读:
    如何快速生成数据文件(fsutil命令,使用CreateFile和SetEndOfFile API函数,fopen和fseek RTL函数)
    TestDisk 数据恢复 重建分区表恢复文件-恢复diskpart clean
    利用winIO3.0进行windows10 64bit端口读取
    一个字体,大小,颜色可定义的自绘静态框控件-XColorStatic 类(比较好看,一共19篇自绘文章)
    美国富人与穷人的四个决定性差别!(冒风险、交朋友、敬业、生活习惯好)
    WebRTC 音视频开发
    协程的理解
    线程、进程、协程和队列
    Confluent
    “Options模式”下各种类型的Options对象是如何绑定的?
  • 原文地址:https://www.cnblogs.com/letben/p/5240356.html
Copyright © 2011-2022 走看看