zoukankan      html  css  js  c++  java
  • C++学习基础十五--sizeof的常见使用

    sizeof的常见用法

    1. 基本类型所占的内存大小

    类型 32位系统(字节) 64位系统(字节)
    char 1 1
    int 4 4
    short 2 2
    long 4 8
    float 4 4
    double 4 8
    指针 4 8

     

    上表中是基本类型在不同平台上所占用的内存大小,例如sizeof(int) = 4。

    2.sizeof计算数组占用的字节数

    使用sizeof计算数组占用内存的字节数的计算方法是 类型字节数*数组长度

    例如:

    1 int m_aNums[3];
    2 sizeof(m_aNums);

     使用sizeof计算m_aNums的字节数是12。

    3.sizeof计算单层结构体的大小

    结构体中的成员变量可以是不同类型,是根据声明的顺序依次存入内存。跟数组不同的是,结构体的大小不是成员变量大小的简单相加。

    结构体所占内存大小的字节数是由结构体内最后一个成员变量的偏移量+最后一个成员变量的字节大小计算而得的。

    计算结构体所占的字节数有两个规则:

    (1)每个结构体内成员变量的偏移量必须是该变量大小的整数倍。

    (2)计算得到的结构体的大小必须是结构体内每个成员变量大小的整数倍,即结构体大小的值是每个成员变量大小的最小公倍数。

    例如:

     1 typedef struct {  
     2     int a;  
     3     double c;  
     4     short b;  
     5 }SA;
     6  
     7 typedef struct {  
     8     int a;  
     9     short b;  
    10     double c;  
    11 }SB;

    结果:sizeof(SA) = 24;sizeof(SB) = 16。

    分析:

    注意:结构体内每个成员变量的偏移量 = 上一个成员变量偏移量 + 上一个成员变量的大小

    SA结构体内:a的偏移量 = 0,a的大小 = 4;

                       c的偏移量 = 8,c的大小 = 8;(注意:c的偏移量不能是4,因此4不是c的大小的整数倍,因此c的偏移量必须补上4位变为8)

                       b的偏移量 = 16,b的大小 =  2;

                       计算得到结果24,不能是18,因为18不是4和8的最小公倍数,因此最后结果是需要补上6位得到其最小公倍数24。                 

    SB结构体内:a的偏移量 = 0,a的大小 = 4;

          b的偏移量 = 4,b的大小 = 2;

          c的偏移量 = 8,c的大小 = 8;(注意:c的偏移量不能6,因为6不是c大小的整数倍,因此补上2位,变为8)

          计算得到结果是16。

    从SA和SB两个结构体的计算大小可知,结构体内变量声明顺序的不同,会导致结构体所占大小的不同。

     

    4.sizeof计算嵌套结构体的大小

    sizeof计算嵌套结构体大小的计算规则:

    (1)将嵌入的结构体展开,被展开的结构体的第一个成员变量的偏移量是被展开结构体中最大的成员变量大小的整数倍。

    (2)最终计算的结构体的大小必须是所有成员变量大小的整数倍,这里所有成员变量计算的是展开后的变量,而不是将嵌入的结构体作为一个整体。

    例如:

    struct SC  
    {  
          short i;  
          struct   
          {  
               char c;  
               int j;  
          } ss;   
          int k;  
    }  

    sizeof(SC) = 16,其中ss.c的偏移量是4,而不是2。

  • 相关阅读:
    win10 网络突然连不上,解决办法
    Windows10下, pip 寻找指定库命令
    Django-Rest-Framework 教程: 5. 提高关联性和超链接API
    Django-Rest-Framework 教程: 6. ViewSets 和 Routers
    Django-Rest-Framework 教程: 4. 验证和权限
    Django-Rest-Framework 教程: 3. 使用 class based views
    Django-Rest-Framework 教程: 1. 序列化 (Serialization)
    Django-Rest-Framework 教程: 2. Requests 和 Responses
    Python——字符串的反转
    Python——指定文件格式
  • 原文地址:https://www.cnblogs.com/calence/p/7246990.html
Copyright © 2011-2022 走看看