水下功夫做透,水上才能顺风顺水。

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++类也遵循类似结构体的对齐规则。

posted @ 2015-04-04 13:44  北方寒士  阅读(583)  评论(0编辑  收藏  举报