结构体空间申请
- 空间申请总是按照之前出现的基准中最大的向后申请 如:前面出现了double 后面在需要空间时都是一次性申请8个字节。遵循规则的基础类型:char、short、int、double、指针(8字节)
- 不管申请空间有多大,变量总是按照自己对齐规则占用申请的空间 如:
//a占用一个字符,但是b占用8个字符, // 因此在a b之间有7个空位 c 后面有3个空格 d占用剩下的4个空格 a 0 0 0 0 0 0 0 b b b b b b b b c 0 d d 0 0 0 0 struct Node{ //此处占用第一的位置 char a; //满足自己的对齐原则,前面也要是8位数,因此跳过七位 double b; //此处已经申请到了以8未基准的空间(double) 且自己占用申请空间的第一位 char c; //此处 使用在c已经申请好的8位的空间,但需要遵循自己的对齐规则,则跳过一位 自己占用两位, short d; //后面还有4位的空的申请空间没用 }
复杂案例解析
typedef struct Node{
//
char a;
short b;
char c;
char d;
int e;
double f;
char g;
int k;
}Node;
解析
- char 一个字节
- short 两个字节
- int 4个字节
- double 8个字节
- a占用一个字节 1
- b占用两个字节,由于a处之开辟了一个空间,无法满足b 2的空间因此对于b需要跳过一个空格,使对齐
- c处由于b是两个字节在开辟c时候就以b两个字节开辟空间,因此c,d刚好占满由于b的大小开辟的空间
- e由于c,d是由b 2字节开辟的空间 不满足自己4个字节 ,因此对于e,cd后面空两个字节刚好占满四个字节
- f同理e只占用了4字节 不满足自己8字节要求 跳过4个字节,与自己对齐,
- g开辟是像更大的f对齐,因此当只有g时就已经申请了8个字节的空间 不论是否有k 当前结构体大小都是1+1+2+1+1+2+4+4+8+8=32
- k由于已经申请了8个字且也满足自己的4字节对齐要求,因此跳3个字节对齐自己自己排在最后。1+1+2+1+1+2+4+4+8+3+4=32