• 更改C编译器的缺省字节对齐方式__align(),__attribute((aligned-(n))),#pragma-pack(n)


    在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:

    1. 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
    2. 使用伪指令#pragma pack (),取消自定义字节对齐方式。

    另外,还有如下的一种方式:

    1. __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
    2. attribute ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
      例子:
    struct cmd1_
    {
        uint32_t d1 = 11;
    };
    struct cmd2_
    {
        uint8_t u8_d1 = 21;
        uint8_t u8_d2 = 22;
        uint16_t u16_d3 = 23;
        uint32_t u32_d4 = 24;
        uint64_t u64_d5 = 25;
        uint64_t u64_d6 = 26;
        uint32_t u32_d7 = 27;
        uint32_t u32_d8 = 28;
    };
    struct fw_cmd_
    {
        struct cmd1_ cmd1;
        struct cmd2_ cmd2;
        
    };
    struct fw_cmd_ fw_cmd;
    

    猜猜sizeof(fw_cmd)=? 应该是4+1+1+2+4+8+8+4+4 = 36实际:

    强制按4字节对齐:

    #include <iostream>
    #include <stdint.h>
    #pragma pack(4)
    struct cmd1_
    {
        uint32_t d1 = 11;
    };
    struct cmd2_
    {
        uint8_t u8_d1 = 21;
        uint8_t u8_d2 = 22;
        uint16_t u16_d3 = 23;
        uint32_t u32_d4 = 24;
        uint64_t u64_d5 = 25;
        uint64_t u64_d6 = 26;
        uint32_t u32_d7 = 27;
        uint32_t u32_d8 = 28;
    };
    struct fw_cmd_
    {
        struct cmd1_ cmd1;
        struct cmd2_ cmd2;
    };
    int main(int argc, char** argv)
    {
        struct fw_cmd_ fw_cmd;
        printf("sizeof(uint8_t):%d
    ", sizeof(uint8_t));
        printf("sizeof(uint16_t):%d
    ", sizeof(uint16_t));
        printf("sizeof(uint32_t):%d
    ", sizeof(uint32_t));
        printf("sizeof(uint64_t):%d
    ", sizeof(uint64_t));
        printf("sizeof(fw_cmd):%d
    ", sizeof(fw_cmd));
        return 0;
    }
    

    输出:

  • 相关阅读:
    【BZOJ2959】—长跑(LCT维护双连通分量+并查集)
    【BZOJ5394】【Ynoi2016】—炸脖龙(树状数组+广义欧拉定理)
    【BZOJ2588】【Spoj10628】—Count on a tree(主席树)
    SCOI2019爆零记+总结反思
    【SCOI2019】—DAY1T1平台跳跃(打表+高精度)
    省选模板复习—【字符串】
    省选模板复习—【数据结构】
    【BZOJ3572】【HNOI2014】—世界树(虚树+倍增+dp)
    python paramiko 模块
    python sys模块
  • 原文地址:https://www.cnblogs.com/spfanlost/p/13764197.html
Copyright © 2020-2023  润新知