我之前在这里发布了一个有关指针转换期间对齐访问的问题,详情请参见此处。总结起来,最好不要使用非对齐访问以实现完全可移植性,因为某些架构可能会抛出异常,或者性能可能会比对齐访问慢得多。
然而,在传输网络数据时,我希望使用一字节对齐,例如,我不想在结构体内添加额外的填充。因此,通常做法是: 有些情况下。
然而,在传输网络数据时,我希望使用一字节对齐,例如,我不想在结构体内添加额外的填充。因此,通常做法是: 有些情况下。
#pragma pack (push, 1)
struct tTelegram
{
u8 cmd;
u8 index;
u16 addr1_16;
u16 addr2_16;
u8 length_low;
u8 data[1];
};
#pragma pack (pop)
那么你可能已经知道我的问题:如果我在结构体上强制使用一字节对齐,这是否意味着它不能完全可移植,因为结构体成员没有对齐?如果我既想要无填充又想要可移植性怎么办?
length_high
、reserved
和next
打包的顺序绝对取决于实现,不同的编译器会有所不同。 - Dietrich Epp