1 // 结构体大小.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <windows.h> 6 #include <iostream> 7 8 using namespace std; 9 10 11 /* 12 结构体计算要遵循字节对齐原则 13 14 结构体默认的字节对齐一般满足三个准则: 15 16 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 17 18 2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding); 19 20 3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding) 21 22 */ 23 24 25 typedef struct _S1_ 26 { 27 char a; 28 short b; 29 char c; 30 }S1; 31 /* 32 S1中,最大是short,2字节 33 char->short->char 34 char是一个字节,要对齐,附近又没有另外的char和他凑 35 所以 36 2 37 2 38 2 39 40 41 第一个char占一个字节 多的这一个补0,只是占位作用 42 short 刚好占2个字节 43 第二个char也占1个 多的这一个补0,只是占位作用 44 45 46 一共6字节 47 48 */ 49 50 51 52 typedef struct _S2_ 53 { 54 char a; 55 char b; 56 short c; 57 }S2; 58 /* 59 S1=2中,最大是short,2字节 60 char->char->short 61 62 char是一个字节,要对齐, 63 第一个char和第二个char正好凑成两个字节 64 65 第一个char占一个字节 第二个char也占1个 66 short 刚好占2个字节 67 68 69 所以 70 1 1 71 2 72 73 即 74 2 75 2 76 77 一共4字节 78 79 */ 80 81 82 83 84 //同理S1、S2 85 typedef struct _S3_ 86 { 87 int i; 88 char c; 89 int j; 90 }S3; 91 92 93 94 //同理S1、S2 95 typedef struct _S4_ 96 { 97 int i; 98 int j; 99 char c; 100 }S4; 101 102 103 104 105 typedef struct _A_ 106 { 107 char a1; 108 short int a2; 109 int a3; 110 double d; 111 112 }A; 113 114 115 116 typedef struct _B_ 117 { 118 long int b2; 119 short int b1; 120 A a; 121 122 }B; 123 /* 124 当结构体成员变量是另外一个结构体时,只要把结构体中成员为另一结构体作为整体相加就行 125 126 对于B,先去掉A a 127 体B 算得 其为8, 128 所以最后结果为8+16=24; 129 130 */ 131 132 133 134 135 int main() 136 { 137 cout << sizeof(S1) << endl; 138 cout << sizeof(S2) << endl; 139 cout << sizeof(S3) << endl; 140 cout << sizeof(S4) << endl; 141 cout << sizeof(A) << endl; 142 cout << sizeof(B) << endl; 143 144 return 0; 145 }