void test_sizeof_自定义对齐pack(){
/************************************************************************/
/* sizeof考点
Sizeof 空类--》表示我存在,sizeof 含static成员的类
Sizeof 指针,数组
一阶关键点:之所以填充,是由于编译器为后面的成员填入,制造合适的身体位置。
以2成员struct为例(32bit,默认对齐)char double…>(1+7)+8; double char (8+max(4,1) );
当计算最后一个成员填充时,要记住结构大小是成员最大的整数倍,所以最后还有文章。
简言之,为后面填充;最终是最大成员整数倍。
*/
/************************************************************************/
bool testbool;
printf("sizeof(testbool) \n",sizeof(testbool));
/************************************************************************/
/* 2012年2月29日8:18:22 */
/************************************************************************/
//
//#pragma pack(push) //保存对齐状态
//#pragma pack(4)//设定为4字节对齐
// struct test
// {
// char m1;
// double m4;
// int m3;
// };
//#pragma pack(pop)//恢复对齐状态
#pragma pack(push)
#pragma pack(1)
struct char_double{
char a;
double d;
} cd;
printf("pack 1 struct char_double %d \n",sizeof( cd));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(2)
struct char_double2{
char a;
double d;
} cd2;
printf("pack 2 struct char_double %d \n",sizeof( cd2));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(4)
struct char_double4{
char a;
double d;
} cd4;
printf("pack 4 struct char_double %d \n",sizeof( cd4));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(8)
struct char_double8{
char a;
double d;
} cd8;
printf("pack 8 struct char_double %d \n",sizeof( cd8));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(16)
struct char_double16{
char a;
double d;
} cd16;
printf("pack 16 struct char_double %d \n",sizeof( cd16));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(3) //warning C4086: 杂注参数应为“1”、“2”、“4”、“8”或者“16”
struct char_double3{
char a;
double d;
} cd3;
printf("-------pack 奇数3 struct char_double %d \n",sizeof( cd3));
#pragma pack(pop)
#pragma pack(push)
#pragma pack(5)
struct char_double5{
char a;
double d;
} cd5;
printf("-------pack 奇数5 struct char_double %d \n",sizeof( cd5));
#pragma pack(pop)
struct char_double0{
char a;
double d;
} cd0;
printf("默认 struct char_double %d \n",sizeof( cd0));
printf("以上2个成员,现在三个成员\n");
struct char_double_int{
char a;
double d;
int i;
}cdi;
#pragma pack(push)
#pragma pack(4)
struct char_double_int4{
char a;
double d;
int i;
}cdi4;
#pragma pack(pop)
printf("默认char_double_int %d\n",sizeof cdi);//!第三个也要占8
printf("pack 4char_double_int %d\n",sizeof cdi4);
/************************************************************************/
/*结果
sizeof(testbool)
pack 1 struct char_double 9
pack 2 struct char_double 10
pack 4 struct char_double 12
pack 8 struct char_double 16
pack 16 struct char_double 16
-------pack 奇数3 struct char_double 16
-------pack 奇数5 struct char_double 16
默认struct char_double 16
*/
/************************************************************************/
/************************************************************************/
/* 三个思考角度:
pack 的参数为2的幂次
pack 为奇数。
pack 大于最大成员的大小 */
/************************************************************************/
}
void test_sizeof_结构体专题(){
printf("这里只讨论 3个成员,多个成员的自己推广。");
struct double_char_int{
double d;
char ch;
int i;
}dci;
struct char_double_int{
char ch;
double d;
int i;
};
printf("sizeof(double_char_int) %d\n",sizeof(double_char_int));
printf("sizeof(char_double_int) %d\n",sizeof(char_double_int));//66:如果是4个成员,int可能就不填充,但它是末尾。
}