怎么计算struct结构所占空间?
以前看过又不太记得,记个笔记,省的每次都要去找
两个原则
-
整体空间是占用空间最大的成员(的类型)所占字节数的整数倍。
-
数据对齐原则—内存按结构体成员的先后顺序排列,当排到该成员时,其前面已摆放的空间大小必须是该成员类型大小的整数倍,如果不够则补齐,依次向后类推。
举个栗子
32位系统下,(64位系统下long字节数不一样)
struct A
{
char a;
double b;
int c;
char d;
};
首先是struct A 的空间
类型 | 字节 | 地址范围 |
---|---|---|
char a | 1 | [0,1) |
double b | 8 | [8,16) (原则2) |
int c | 4 | [16,20) |
char d | 1 | [20,21) |
总大小 | 24(原则1) |
优化代码
struct A_opt
{
char a;
char d;
int c;
double b;
};
sizeof(struct A_opt)=1+1+2(原则2)+4+8=16
struct A
{
char a;
double b;
int c;
char d;
};
struct B
{
char a;
struct A b;
int c;
};
然后是struct B 的空间
类型 | 字节 | 地址范围 |
---|---|---|
char a | 1 | [0,1) |
struct A b | 24 | [8,32) (原则2) |
int c | 4 | [32,36) |
总大小 | 40(原则1,以struct A中的double为基础) |
__packed 优化
__packed是字节对齐的意思。比如说int float double char它的总大小是4 + 4 + 8 + 1 = 17;
如果不用__packed的话,系统将以默认的方式对齐(假设是4字节),那么它占4 + 4 + 8 + 4 = 20(24原则一);(不足4字节以4字节补齐)。
typedef __packed struct