zoukankan      html  css  js  c++  java
  • 【C语言】结构体占用字节数及存储与空间分配

    我们都知道在数据类型中,char类型占1个字节,short占2个字节,int占4个字节,long占8个字节等等。

    在计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取决于结构体中最大基本类型的大小,下面我们看几个例子:

    1.

    struct A
    {
      char a;
      int b;
      short c;
    }str1;

    这里char占1个字节,int占4个字节,short占2个字节,按单元存放如下图:

      1  2  3  4

    a      
    b b b b
    c c    

    由于a占用了1个字节,b存不下,所以开辟新的单元存放b,然后再开辟新的单元存放c。

    从这里可以看出结构体在内存中是按单元存放的,总占用字节数就是3*4=12

    2.

    struct B
    {
      char a;
      short c;
      int b;
    }str2;

    存放如图:

      1  2  3  4

    a  
    b b b b

    在这里由于b占用4个字节,而a和c总共才占用3个字节,足够c存放,所以c存放在a的后面,再开辟新的单元存放b。

    此例中占用字节数为2*4=8

    3.

    struct c
    {
      char a;
      char b[2];
      char c[4];
    }str3;

    存放如图:

      1  2  3  4  5  6  7

    a b b c c c c

    这里由于数据类型都为char类型,故不必再开辟新的单元,一行存完。

    占用字节数为1*1+2*1+4*1=7

    综上所述,结构体在内存中存放是按单元存放的,所开辟单元的最大长度取决于占字节最大的数据类型,此外我们可以发现存储顺序对空间的使用率有一定的影响。

    从以上三例可以看出,第一种最浪费空间;第三种最节省空间,但全使用相同类型,丢失了字段本生的数据类型,不方便使用;第二种介于第一种和第三种写法之间,其空间上比较紧凑,同时又保持了结构体中字段的数据类型。大家可以尝试用sizeof()去深入了解结构体中的按单元存放。

  • 相关阅读:
    4.Spring系列之Bean的配置1
    3.Spring系列之IOC&DI
    2.Spring系列之HelloWorld
    1.spring系列之简要概述
    SVN 安装与使用
    6.用CXF编写基于Spring的WebService
    5.webService拦截器
    4.CXF所支持的数据类型
    APP消息推送及疑问解答
    VMware安装CentOS
  • 原文地址:https://www.cnblogs.com/adamjwh/p/5828059.html
Copyright © 2011-2022 走看看