为何 #pragma pack 4 无效

#pragma pack(4)                     // 编译器将按照4个字节对齐
struct AudioHead_ST {
    uint16_t u16Head = 0xabcd;          // 2
    uint32_t u32FrameId = 0;            // 4
    uint32_t u32PacketType = 0;         // 4
    uint64_t u64SendTime = 0;           // 8
    uint64_t u64AudioTime = 0;          // 8
    uint16_t u16AudioType = 3;          // 2
    uint32_t u32SampleRate = 16000;     // 4
    uint16_t u16BitWidth = 16;          // 2
    uint16_t u16AudioMode = 0;          // 2
    uint32_t u32DataSize = 0;           // 4
    uint32_t u32Reserve0 = 0;           // 4
    uint32_t u32Reserve1 = 0;           // 4
};
#pragma pack()                      // 取消自定义字节对齐方式


printf("\n\n sizeof(audio) = %d\n", sizeof(AudioHead_ST));  // 52

为何不是 48 ?
因对齐的原则是min(sizeof(word ),4)=4, 是4字节对齐,此处需要2字节对齐。


把 #pragma pack(4) 改成 #pragma pack(1) 或者 #pragma pack(2) 都是 48 字节。


还有一个情形是把大小相同的数据类型放在一起,也可。
如下:

#pragma pack(4)
struct AudioHead_ST {
    uint16_t u16Head = 0xabcd;
    uint16_t u16AudioType = 3;
    uint16_t u16BitWidth = 16;
    uint16_t u16AudioMode = 0;
    uint32_t u32FrameId = 0;
    uint32_t u32PacketType = 0;
    uint64_t u64SendTime = 0;
    uint64_t u64AudioTime = 0;    
    uint32_t u32SampleRate = 16000;    
    uint32_t u32DataSize = 0;
    uint32_t u32Reserve0 = 0;
    uint32_t u32Reserve1 = 0;
};
#pragma pack()

printf("\n\n sizeof(audio) = %d\n", sizeof(AudioHead_ST));  // 48

改成 8 也是 48.
#pragma pack(8)
struct AudioHead_ST {
    uint16_t u16Head = 0xabcd;
    uint16_t u16AudioType = 3;
    uint16_t u16BitWidth = 16;
    uint16_t u16AudioMode = 0;
    uint32_t u32FrameId = 0;
    uint32_t u32PacketType = 0;
    uint64_t u64SendTime = 0;
    uint64_t u64AudioTime = 0;    
    uint32_t u32SampleRate = 16000;    
    uint32_t u32DataSize = 0;
    uint32_t u32Reserve0 = 0;
    uint32_t u32Reserve1 = 0;
};
#pragma pack()

printf("\n\n sizeof(audio) = %d\n", sizeof(AudioHead_ST));  // 48

甚至不加 #pragma pack , 也是 48
struct AudioHead_ST {
    uint16_t u16Head = 0xabcd;
    uint16_t u16AudioType = 3;
    uint16_t u16BitWidth = 16;
    uint16_t u16AudioMode = 0;
    uint32_t u32FrameId = 0;
    uint32_t u32PacketType = 0;
    uint64_t u64SendTime = 0;
    uint64_t u64AudioTime = 0;    
    uint32_t u32SampleRate = 16000;    
    uint32_t u32DataSize = 0;
    uint32_t u32Reserve0 = 0;
    uint32_t u32Reserve1 = 0;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值