结构体内存分析

2020-09-08  本文已影响0人  清描淡寫_

一.结构体的构成

结构体是由多个成员构成,成员的类型可以是基础数据类型(int、double、bool等)、指针或是其他的结构体。一下是一个结构体的例子:

typedef struct PersonStruct {
    double height;      
    char   firstName;   
    int    age;         
    short  weight;      
} PersonStruct;

二.计算结构体尺寸大小的规则

1.数据成员对齐规则:

第一个数据成员要放在0的起始位置,之后的成员位置的起始位置要根据自身的大小的整数倍去存放。

2.结构体作为成员:

结构体作为成员时,自身的存储位置要根据结构内的最大成员的整数倍去存储

3.收尾:

结构体的总大小一定是结构体内最大成员的整数倍,实际大小如果不够,则需要进行补齐。

以64位为例:

height的大小为8,firstName的大小为1,age的大小为4,weight的大小为2。根据规则可得这些成员所占位置为:
height:0-7
firstName:8
age:12-15
weight:16-17
可得结构体PersonStruct的实际大小为18,根据规则3以8的整数倍进行补齐可得PersonStruct的大小为24。


图例.png

根据图例可以看出,这样会出现留空的情况,会产生出较多的内存浪费,所以可以优化结构体的成员排列:

typedef struct PersonStruct {
    double height;     
    int    age; 
    short  weight;
    char   firstName;  
} PersonStruct;

这样排列会使得结构体PersonStruct的大小由24变为16:


更新排版.png

降低了内存的占用。

上一篇下一篇

猜你喜欢

热点阅读