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

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));

    /************************************************************************/

    /* 20122298: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可能就不填充,但它是末尾。

 

}

原文地址:https://www.cnblogs.com/titer1/p/2374853.html