牵扯到C++结构体内存分配问题。
结构体的成员变量若同时存在short、int、double型。
struct A
{
int a;
char b;
short c;
};
struct B
{
char b;
int a;
short c;
};
顺序不同其内存空间大小分配是不一样的。int占4个字节,char占1个自己,short占2个字节。但struct A实际占用字节数也就是sizeof(struct A)
为8,而B为12。
因为在结构体A中,a占用4个字节,b占用1个字节,c占用2个字节,而由于为了提高CPU存储变量的速度,实际上c是按照c的字节数也就是2字节对其的,所以b之后会空余1个字节。
但是如此以来B为何不是10字节而是12字节?首先说为什么是10字节。因为b占用1个字节,而a默认占用4个字节,所以默认a之前必须为4个字节长度的整数倍才能索引到a,即b后空余三个字节。至于c为何占用4个字节,是因为结构体之间的对齐要求结构体长度为结构体内最大长度的数据类型的长度的整数倍,在此示例中最长的数据类型为int。总结为:a默认对齐为4字节,因为b在a前面,b占1字节,所以b之后必须空余3字节,而因为整个结构体之间对齐必须为最长类型默认对齐长度的整数倍,所以结构体B为12字节。
若要改变内存占用大小,最简单的方式为在结构体前加上pragma pack(1)
这样读取速度会变慢但内存使用量会大量减少。
#pragma pack(1)//设定为4字节对齐
struct B
{
char b;
int a;
short c;
};
此时sizeof(struct B)
为7;