结构体字节大小
不设置对齐方式: 1)无结构体嵌套的情况 结构体的大小为最后一个成员的偏移量+其所占的字节数,除了这个准则外,还需要满足以下的两个原则: 1:结构体中成员的偏移量必须是该成员所在字节数的整数倍。 2:结构体的大小必须为成员中最大基础类型的整数倍 2)有结构体嵌套的情况 需要将嵌套的结构体展开,并且被展开结构体的第一个成员变量的偏移量必须为这个被展开结构体中所占最大字节成员的整数倍。并符合上述1:2:的原则。
#include "stdlib.h"
#include "stdio.h"
typedef struct s1{
char a[13];
int x;
}s1;
typedef struct s2{
char a[13];
int x;
char b;
}s2;
typedef struct s3{
char a[13];
int x;
double b;
}s3;
typedef struct s4{
char a;
s1 b;
char f;
s2 c;
char g;
s3 d;
char e;
}s4;
int main()
{
printf("sizeof s1 is %d \n",sizeof (s1));
printf("sizeof s2 is %d \n",sizeof (s2));
printf("sizeof s3 is %d \n",sizeof (s3));
printf("sizeof s4 is %d \n",sizeof (s4));
return 1;
}
sizeof s1 is 20 sizeof s2 is 24 sizeof s3 is 32 sizeof s4 is 96
设置对齐方式:#pragma pack(n) 1、如果数据类型得到的对齐方式比n的倍数大,那就按照n的倍数指定的方式来对齐(这体现了开发者可以选择不使用推荐的对齐方式以获得内存 较大的利用率) 2、如果按照数据类型得到的对齐方式比n小,那就按照前者指定的方式来对齐(一般如果不指定对齐方式时,编译器设定的对齐方式会比基本类型的对齐方式大)
#include "stdlib.h"
#include "stdio.h"
#pragma pack(2)
typedef struct s1{
char a[13];
int x;
}s1;
typedef struct s2{
char a[13];
int x;
char b;
}s2;
typedef struct s3{
char a[13];
int x;
double b;
}s3;
typedef struct s4{
char a;
s1 b;
char f;
s2 c;
char g;
s3 d;
char e;
}s4;
int main()
{
printf("sizeof s1 is %d \n",sizeof (s1));
printf("sizeof s2 is %d \n",sizeof (s2));
printf("sizeof s3 is %d \n",sizeof (s3));
printf("sizeof s4 is %d \n",sizeof (s4));
return 1;
}
sizeof s1 is 18 sizeof s2 is 20 sizeof s3 is 26 sizeof s4 is 72
|