zoukankan      html  css  js  c++  java
  • 笔试常见题型——计算结构体大小

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

  • 相关阅读:
    HDOJ 1846 Brave Game
    并查集模板
    HDU 2102 A计划
    POJ 1426 Find The Multiple
    POJ 3278 Catch That Cow
    POJ 1321 棋盘问题
    CF 999 C.Alphabetic Removals
    CF 999 B. Reversing Encryption
    string的基础用法
    51nod 1267 4个数和为0
  • 原文地址:https://www.cnblogs.com/victorywr/p/13225569.html
Copyright © 2011-2022 走看看