zoukankan      html  css  js  c++  java
  • 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可能就不填充,但它是末尾。

     

    }

  • 相关阅读:
    线性表ADT实现
    基数排序
    二叉树之已知前序和中序遍历求后序遍历(POJ2255 &&HDU )
    acm头文件
    快排
    快读
    二分
    数据结构大师
    AC_2. 01背包问题
    AC_94. 递归实现排列型枚举
  • 原文地址:https://www.cnblogs.com/titer1/p/2374853.html
Copyright © 2011-2022 走看看