sizeof结构体
规则1:结构体的对折长度为其基本数据成员的长度的最大值。
规则2:指定边界情况下,结构体的对折长度为自身对折长度和指定对折长度中较小者。
规则3:当行内结构体的基本数据成员的起始地址必须为其长度的整数倍。
规则4:嵌套取对折长度的情况,里层结构体作为一个变量。
· 使用伪指令 #pragma pack (n) ,指定n字节对齐。
· n的有效值为1、2、4、8、16等,当n=1时,结构体长度为自成员变量长度相加。
· 使用伪指令 #pragma pack () ,取消指定。
1 #include <stdio.h> 2 struct{ 3 char a; 4 int b; 5 char c; 6 double d; 7 }s; 8 #pragma pack(8) 9 typedef struct example1 10 { 11 short a; 12 long b; 13 }example1; 14 typedef struct example2 15 { 16 char c; 17 example1 struct1; 18 short e; 19 }example2; 20 #pragma pack() 21 22 int main(int argc, char* argv[]) 23 { 24 example2 struct2; 25 printf("%d\n",sizeof(s)); 26 printf("%d\n",sizeof(example1)); 27 printf("%d\n",sizeof(example2)); 28 printf("%d\n",(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)); 29 return 0; 30 }
1 #include <stdio.h> 2 #pragma pack(2) 3 typedef struct example1 4 { 5 short a; 6 long b; 7 double c; 8 }example1; 9 #pragma pack() 10 #pragma pack(4) 11 typedef struct example2 12 { 13 char c; 14 example1 struct1; 15 short e; 16 }example2; 17 #pragma pack() 18 19 int main(int argc, char* argv[]) 20 { 21 example2 struct2; 22 printf("%d\n",sizeof(example1)); 23 printf("%d\n",sizeof(example2)); 24 printf("%d\n",(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)); 25 return 0; 26 }
规则5:嵌套结构体内一字节对齐时,一字节追加。二字节对齐时,二字节追加。
1 #include <stdio.h> 2 #pragma pack(2)//1、2 3 typedef struct example1 4 { 5 char d; 6 short a; 7 long b; 8 double c; 9 }example1; 10 #pragma pack() 11 #pragma pack(4) 12 typedef struct example2 13 { 14 char c; 15 example1 struct1; 16 double e; 17 }example2; 18 #pragma pack() 19 20 int main(int argc, char* argv[]) 21 { 22 example2 struct2; 23 printf("%d\n",sizeof(example1)); 24 printf("%d\n",sizeof(example2)); 25 printf("%d\n",(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)); 26 return 0; 27 }
补充数组:
比如char a[3],它的对齐方式和分别写3个char是一样的.也就是说它还是按1个字节对齐.
如果写: typedef char Array3[3];
Array3这种类型的对齐方式还是按1个字节对齐,而不是按它的长度.
不论类型是什么,对齐的边界一定是1,2,4,8,16....中的一个。
C++类也遵循类似结构体的对齐规则。