嵌入式C语言之struct内存分配(对齐)
为了提高CPU的存储速度,对一些变量的起始地址做了“对齐”处理。在默认情况下,规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。同时为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。
#pragma pack(n)作用:来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。
注:对于结构体中包含其他结构体时,按结构体大小计算,对应结构体中包含数组,用数组类型计算。
例题:
#include <stdio.h>
#pragma pack(push)
#pragma pack(8)
struct mystr
{
int b;
double a;
int c;
};
struct test
{
int a;
struct mystr s1;
double b;
int c;
};
struct my
{
char name[10];
char a;
int b;
};
int main()
{
printf("sizeof(mystr) = %d\n",sizeof(struct mystr));
printf("sizeof(test) = %d\n",sizeof(struct test));
printf("sizeof(my) = %d\n",sizeof(struct my));
return 0;
}
结果: