规则1:结构体的对折长度为其基本数据成员的长度的最大值。

规则2:指定边界情况下,结构体的对折长度为自身对折长度和指定对折长度中较小者。

规则3:当行内结构体的基本数据成员的起始地址必须为其长度的整数倍。

规则4:嵌套取对折长度的情况,里层结构体作为一个变量。

· 使用伪指令 #pragma pack (n) ,指定n字节对齐。

· n的有效值为1、2、4、8、16等,当n=1时,结构体长度为自成员变量长度相加。

· 使用伪指令 #pragma pack () ,取消指定。

 #include <stdio.h>
struct{
char a;
int b;
char c;
double d;
}s;
#pragma pack(8)
typedef struct example1
{
short a;
long b;
}example1;
typedef struct example2
{
char c;
example1 struct1;
short e;
}example2;
#pragma pack() int main(int argc, char* argv[])
{
example2 struct2;
printf("%d\n",sizeof(s));
printf("%d\n",sizeof(example1));
printf("%d\n",sizeof(example2));
printf("%d\n",(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2));
return ;
}

sizeof结构体-LMLPHP

 #include <stdio.h>
#pragma pack(2)
typedef struct example1
{
short a;
long b;
double c;
}example1;
#pragma pack()
#pragma pack(4)
typedef struct example2
{
char c;
example1 struct1;
short e;
}example2;
#pragma pack() int main(int argc, char* argv[])
{
example2 struct2;
printf("%d\n",sizeof(example1));
printf("%d\n",sizeof(example2));
printf("%d\n",(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2));
return ;
}

sizeof结构体-LMLPHP

规则5:嵌套结构体内一字节对齐时,一字节追加。二字节对齐时,二字节追加。

 #include <stdio.h>
#pragma pack(2)//1、2
typedef struct example1
{
char d;
short a;
long b;
double c;
}example1;
#pragma pack()
#pragma pack(4)
typedef struct example2
{
char c;
example1 struct1;
double e;
}example2;
#pragma pack() int main(int argc, char* argv[])
{
example2 struct2;
printf("%d\n",sizeof(example1));
printf("%d\n",sizeof(example2));
printf("%d\n",(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2));
return ;
}

sizeof结构体-LMLPHP

补充数组:

比如char a[3],它的对齐方式和分别写3个char是一样的.也就是说它还是按1个字节对齐.
如果写: typedef char Array3[3];
Array3这种类型的对齐方式还是按1个字节对齐,而不是按它的长度.
不论类型是什么,对齐的边界一定是1,2,4,8,16....中的一个。

C++类也遵循类似结构体的对齐规则。

05-25 07:57