数据结构占用存储空间——struct

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxgdll/article/details/60580133

Struct结构体的内存空间占用

结构体字节对齐

在计算机中,数据存储和传输通常是以bit为单位,8个bit组成一个字节(byte).因此,在32位系统中,计算机的字长为32位,即4个字节;64位系统中,计算机的字长为64位,即8个字节。计算机系统在内存管理时,会遵循内存对齐的规则,也就是说,
在32位系统中,遵循4字节对齐,按4个字节为单位分配存储空间,如果不足,会自动补充,如果剩余的空间不足以存放下面的变量,则会重新分配空间。
在64位系统中,遵循8字节对齐,按8个字节为单位分配存储空间。
默认对齐模数通常为:


编译器按照结构体成员列表的顺序为每个成员分配内存,当存储成员时,需要满足正确的边界对齐要求,成员之间可能出现用于填充额外的内存空间。

例子:
Struct E{
    unsigned int a;  //64位,对于开始的第一个8字节内存,a占4字节
    char b[2];     //b[]占2个字节,接在a后连续使用2个字节内存,还剩两个字节
    double c;      //c占8个字节,不足以放在剩余未使用的2个字节,因此,将这两个字节补全。重新开辟了第二个8字节的内存,存放c
    short d;       //d占2个字节,开辟第三个8字节。剩余的6个字节补齐。
}
64位系统下,总共开辟了8*3=24个字节

以下还有其余几种struct内存计算的例子:

空结构体:
struct E
{}; 

sizeof(E);
C为空结构体,在C语言中占0字节,在C++中占1字节。

结构体有静态成员
struct E{
char a;
int b;
static double c; //静态成员
};
sizeof(E) //静态成员存放在全局数据去,不占用结构体的内存
4+4=8个字节
结构体中包含指针
struct A
{
int* p;
int b;
double c;
}
//64位系统下,无论指针指向什么类型,占位都是8个字节
//32位系统下,无论指针指向什么类型,占位都是4个字节
32位:sizeof(A)=4+4+8=16
64位:sizeof(A)=8+8+8=24
结构体中包含结构体
struct E{  
int a;  
double b;  
float c;  
};  
struct F{  
char e[2];  
int f;  
short h;  
struct E i;  
};
sizeof(E)=8+8+8=24
sizeof(F)=4+4+8+24=40
结构体包含共用体
structunion
union A{ //需要注意共用体不同类型的变量存放在同一段内存单元中,共用体变量所占的内存长度等于最长的成员的长度。
long a;
double b;
char n[9];
int c[2];
};
struct B
{
int a;
double b;
float c;
A myUnion;
};
共用体中的最大对齐模数为8,所以sizeof(A)=16
sizeof(E)=8+8+8+16=40

注意
结构体的对齐可以通过#pragma pack()指定

#pragma pack(2)
struct G{
int a;
char b;
double c;
}
sizeof(G)=4+2+8=14

猜你喜欢

转载自blog.csdn.net/zxgdll/article/details/60580133