结构体是使用struct定义的结构
struct test{
char a;//1
int b;//4
long c;//8
void* d;//8
int e;//4
char* f;//8
}
在代码中标记了每个成员的大小,那么结构体的总大小是1+4+8+8+4+8=33吗?但实际上总大小是40,为什么是40而不是33呢,这里 涉及结构体对齐 的问题,如图1
虽然char a只占了1字节,int b只占了4字节,但是long c并不是紧跟着b,而是根据8字节对齐后(大小跟系统有关),c和b之间空了3字节,同样,char*和int 之间也空了4个单位,虽然浪费了7字节,但得益于内存对齐,存取速度会更快,这是结构体对齐的基础。
接下来讨论一下联合体(union)
union test{
char a;//1
int b;//4
long c;//8
};
那么联合体是怎样的一种格式呢,它复用了同一块内存,如图2
图2
从图中可以看出,b和c共用同一块内存,修改a,也会影响b和c的值,同时可以知道联合体的大小为其最大成员的大小为其最大的成员long c的大小8
网友评论