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


    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)));
    
    }

  • 相关阅读:
    MVC--全选反选
    文件上传(表单,Ajax)、文件下载
    Java的一些细节语法(不定时更新。。。)
    并发基础知识
    Linux基本命令操作
    Linux基本操作和自己动手组装服务器
    VMware虚拟机和CentOS系统的安装过程
    安装操作系统
    中间件介绍
    wifi破解
  • 原文地址:https://www.cnblogs.com/victorywr/p/13225569.html
Copyright © 2020-2023  润新知