结构体内存对齐
提前总结:结构体的大小一定是结构体中最大成员的大小的倍数,即结构体的大小主要由最大的成员决定。
比如一个结构体中成员的大小分别是 1、2、4、2、1,最大的是4,那么每个内存块的大小就是4,1和2放在第一个块里面,不足的为空,第二个内存块为4,第三个内存块为2和1,共三个块,大小为12。
规则:一个结构体有三个成员,分别是char、int、short类型,三个成员位于结构体中不同位置时整个结构体的大小可能是
#include <stdio.h>
struct s1{char a; int b; short c;};
struct s2{char a; short c; int b;};
struct s3{int b; char a; short c;};
struct s4{int b; short c; char a;};
struct s5{short c; int b; char a;};
struct s6{short c; char a; int b;};
int main()
{
printf("char int short 排列大小 = %ld \n", sizeof(struct s1)); // char占1个字节,int占4个字节,1个字节存储不下,扩充为4个字节,short2个字节,填充2个字节
printf("char short int 排列大小 = %ld \n", sizeof(struct s2)); // char 和short+1共占4个字节,int独占一个4位的字节
printf("int char short 排列大小 = %ld \n", sizeof(struct s3)); // int 独占4个字节,char 和short+1共占一个4位字节
printf("int short char 排列大小 = %ld \n", sizeof(struct s4));
printf("short int char 排列大小 = %ld \n", sizeof(struct s5));
printf("short char int 排列大小 = %ld \n", sizeof(struct s6));
return 0;
}
输出结果
char int short 排列大小 = 12
char short int 排列大小 = 8
int char short 排列大小 = 8
int short char 排列大小 = 8
short int char 排列大小 = 12
short char int 排列大小 = 8
一个结构体中含有相同的成员,排列顺序不同,就有不同的大小。
举s1的例子:假设有一块20个字节的连续内存空间
char 存入占一个字节,int存入占4个字节,然后因为内存对齐的原因,char后面需要补充3个空,占4个字节位,short后面补充2个空。
总结 :
- 向最大的类型看齐,每一个内存块都是最大的类型所占的内存的大小,总大小是最大类型所占内存大小的倍数。
2.想要节省内存空间可以按照类型大小顺序初始化结构体。