#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;
};