字节对齐

一:通过#pragma pack(n)改变C编译器的字节对齐方式,在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等) 的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空 间。

    struct mystruct1{
        char a;
        int b;
        short c;
        long d;
    };

    #pragma pack(2)
    struct mystruct2{
        char a;
        int b;
        short c;
        long d;
    };

    #pragma pack(1)
    struct mystruct3{
        char a;
        int b;
        short c;
        long d;
    };

    #pragma pack()
    struct mystruct4{
        char a;
        int b;
        short c;
        long d;
    };

    int _tmain(int argc, _TCHAR* argv[])
    {
        int a_len;
        int b_len;
        int c_len;
        int d_len;

        struct mystruct1 s1;
        struct mystruct2 s2;
        struct mystruct3 s3;
        struct mystruct4 s4;

        printf("sizeof(char)=%d sizeof(int)=%d sizeof(short)=%d sizeof(long)=%d/n",sizeof(char), sizeof(int), sizeof(short), sizeof(long));

        /*mystruct1*/
        a_len = (char*)&(s1.b) - (char*)&(s1.a);
        b_len = (char*)&(s1.c) - (char*)&(s1.b);
        c_len = (char*)&(s1.d) - (char*)&(s1.c);
        d_len = sizeof(mystruct1) - (a_len + b_len + c_len);
        printf("sizeof(a)=%d sizeof(b)=%d sizeof(c)=%d sizeof(d)=%d/n",a_len,b_len,c_len,d_len);

        /*mystruct2*/
        a_len = (char*)&(s2.b) - (char*)&(s2.a);
        b_len = (char*)&(s2.c) - (char*)&(s2.b);
        c_len = (char*)&(s2.d) - (char*)&(s2.c);
        d_len = sizeof(mystruct2) - (a_len + b_len + c_len);
        printf("sizeof(a)=%d sizeof(b)=%d sizeof(c)=%d sizeof(d)=%d/n",a_len,b_len,c_len,d_len);

        /*mystruct3*/
        a_len = (char*)&(s3.b) - (char*)&(s3.a);
        b_len = (char*)&(s3.c) - (char*)&(s3.b);
        c_len = (char*)&(s3.d) - (char*)&(s3.c);
        d_len = sizeof(mystruct3) - (a_len + b_len + c_len);
        printf("sizeof(a)=%d sizeof(b)=%d sizeof(c)=%d sizeof(d)=%d/n",a_len,b_len,c_len,d_len);

        /*mystruct4*/
        a_len = (char*)&(s4.b) - (char*)&(s4.a);
        b_len = (char*)&(s4.c) - (char*)&(s4.b);
        c_len = (char*)&(s4.d) - (char*)&(s4.c);
        d_len = sizeof(mystruct4) - (a_len + b_len + c_len);
        printf("sizeof(a)=%d sizeof(b)=%d sizeof(c)=%d sizeof(d)=%d/n",a_len,b_len,c_len,d_len);

        return 0;
    }

输出:
    sizeof(char)=1 sizeof(int)=4 sizeof(short)=2 sizeof(long)=4
    sizeof(a)=4 sizeof(b)=4 sizeof(c)=4 sizeof(c)=4
    sizeof(a)=2 sizeof(b)=4 sizeof(c)=2 sizeof(c)=4
    sizeof(a)=1 sizeof(b)=4 sizeof(c)=2 sizeof(c)=4
    sizeof(a)=4 sizeof(b)=4 sizeof(c)=4 sizeof(c)=4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值