如果我将字节数组转换为 __attribute__((packed, aligned(2))) 结构会发生什么?
What will happen if I cast a byte array to an __attribute__((packed, aligned(2))) struct?
我有一些定义结构的 C++ 代码:
struct IcmpHdr
{
uint8_t m_type;
uint8_t m_code;
uint16_t m_chksum;
uint16_t m_id;
uint16_t m_seq;
} __attribute__((packed, aligned(2)))
我了解此结构在分配时将始终与可被 2 整除的地址对齐,因为必要时会在结构前面添加一个填充字节。
在通过线路在接收端解压缩之前,此结构被强制转换为字节数组。现在,如果我将字节存储在数组 char byte_array[8];
中,接收端会发生什么
然后最终将其转换为指向我的类型的指针?
IcmpHdr* header = (IcmpHdr*)byte_array;
结构是否有 50/50 的机会错位?这会在取消引用成员时导致未定义的行为吗?其他问题?
我知道我可以将数组对齐到 2 字节边界上,甚至不必考虑这个问题。好奇心是我提问的主要原因。
- 避免指针双关,因为它几乎总是违反严格的别名规则。
- 您的结构对齐并不重要,因为您的字节数组不必对齐 2 个字节。
使用memcpy
IcmpHdr header;
memcpy(&header, byte_array, sizeof(header));
如果您使用现代优化编译器,则不太可能 memcpy
被调用。
我有一些定义结构的 C++ 代码:
struct IcmpHdr
{
uint8_t m_type;
uint8_t m_code;
uint16_t m_chksum;
uint16_t m_id;
uint16_t m_seq;
} __attribute__((packed, aligned(2)))
我了解此结构在分配时将始终与可被 2 整除的地址对齐,因为必要时会在结构前面添加一个填充字节。
在通过线路在接收端解压缩之前,此结构被强制转换为字节数组。现在,如果我将字节存储在数组 char byte_array[8];
然后最终将其转换为指向我的类型的指针?
IcmpHdr* header = (IcmpHdr*)byte_array;
结构是否有 50/50 的机会错位?这会在取消引用成员时导致未定义的行为吗?其他问题?
我知道我可以将数组对齐到 2 字节边界上,甚至不必考虑这个问题。好奇心是我提问的主要原因。
- 避免指针双关,因为它几乎总是违反严格的别名规则。
- 您的结构对齐并不重要,因为您的字节数组不必对齐 2 个字节。
使用memcpy
IcmpHdr header;
memcpy(&header, byte_array, sizeof(header));
如果您使用现代优化编译器,则不太可能 memcpy
被调用。