• 笔试常见题型——计算结构体大小


    struct A {
    	char a1;
    	short a2;
    	int a4;
    	char *p1;
    };
    

      这么个结构体,如何计算它在内存里占用的大小?

    这里涉及到的就是计算机内部数据存储原则,需要对齐,若是按常规的64位机器:char型=1Byte,short =2Byte,int=4Byte,指针8Byte  最后结果相加1+2+4+8=15 那么就错了

    三个原则:

      原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int32位机为4字节,则要从4的整数倍地址开始存储)。

      原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct bb里有charintdouble等元素,那b应该从8的整数倍开始存储。)

      原则3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

     

    按照这三个原则计算一遍:

    char=1Byte  内存地址若为0

    short=2Byte  按原则一,此时内存1的位置还没有数据,可它需要从2的倍数开始存储,所以它开始地址在2

    int=4Byte  按原则一,此时刚好到地址4没有数据,那么就从地址4开始占据4个字节

    指针=8Byte 按原则一要从地址为8的位置开始,刚好到地址8还没有数据,所以,从8开始占据8个字节

    最后看是否满足其他原则,这里没有结构体成员,所以只看原则三了,最后的内存总数为1+1个空闲+2+4+8=16 ,其中最大的指针的内存8Byte,16是8的倍数,所以满足该原则。

    用一个图更好理解:

     看到其中白色部分是为了满足原则一而空闲出来的部分,所以最后该结构体的大小为16Byte。

    改换一下结构体内的顺序:

    struct A {
        char a1;
        int a4;
        short a2;
        char *p1;
    };        

    将与short的顺序变换了一下,其他都一样:

    同样三原则走下去:

    char=1Byte              内存: 0

    int=4Bytr  但从内存4开始计算      内存 : 4-7

    short=2Byte  从内存8开始      内存:  8-9  

    *p指针=8Byte 需要从内存16开始 内存:内存:16-23

    最后占据24个字节,是8的倍数,所以结构体占据24个字节。载配合图片好好理解一下,白色是为满足对齐原则消耗的内存

     测试程序包含一些其他类型的内存计算:

    struct A {
        
        char a1;
        int a4;
        short a2;
        char *p1;
    };
    
    int main()
    {
        struct A a;
        char b[30];
        char* c = (char*)malloc(sizeof(char*)*10);
        printf("%d ", sizeof(a));
        printf("%d ", sizeof(b));
        printf("%d ", sizeof(b[3]));
        printf("%d ", sizeof(c));
        printf("%d ", sizeof(*(c + 3)));
    
    }

  • 相关阅读:
    cocos代码研究(6)有限时间动作类(FiniteTimeAction)学习笔记
    cocos代码研究(5)Action学习笔记
    cocos代码研究(1)Node学习笔记
    cocos代码研究(2)Label学习笔记
    顽石系列:Linux基础笔试
    Spring笔记:事务管理
    Spring笔记:AOP基础
    Spring笔记:IOC基础
    MyBatis:学习笔记(4)——动态SQL
    Linux:进程管理
  • 原文地址:https://www.cnblogs.com/victorywr/p/13225569.html
Copyright © 2020-2023  润新知