您的位置:首页 > 其它

sizeof 与struct(2个成员的,3个成员的) ..pack(1,2,4,8,16,32)的宏测试 hxf讨论对齐的根本原因

2012-02-29 23:54 344 查看
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可能就不填充,但它是末尾。

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: