LINUX、WIN32、MACOSX多个平台上GCC、MSVC之间结构体按序列大小1字节对齐
对于GNU编译器,在某些版本编译器及LINUX发行版上,为结构体对齐1字节,应采用以下方式。
typedef struct __attribute__((packed))
{
uint16_t receive_id;
} vmux_linlayer_add_ack_packet;
即,采用 GNU编译器的间距跨平台编译的,应首选采用GNU/GCC编译器特性,__attribute__((packed)) 来声明该结构体为1字节序列对齐。
对于兼容性其它编译器,应按照C++,语言标准使用编译器指令 #pragma pack(push, 1) 来进行1字节序列对齐。
考虑多编译器多平台编译的 C++ 语言兼容性,其结构体的声明,必须为以下形式:
#pragma pack(push, 1)
typedef struct
#if defined(__GNUC__) || defined(__clang__)
__attribute__((packed))
#endif
{
uint16_t receive_id;
} vmux_linlayer_add_ack_packet;
#pragma pack(pop)
GNU编译器虽然支持 #pragma pack(push, 1) 来进行对齐,但在一些特殊的LINUX平台及特定的GNU编译器版本上支持是有问题的,即:我们预期对齐是19字节,但它仍旧是23个字节,但通过GNU编译器单独的 __attribute__((packed)) 特性,可以解决该问题。
如果,你只是在AMD64、I383、I686平台上面,搞搞是不会遇到这种问题的,但如果你搞一些大多数人未曾听闻的CPU指令集平台的程序,那就不一定遇不到这个问题了,所以,如果计划C++一份代码可以移植到多个平台编译器运行,那么你应当按照本文的信息,对C++结构体1字节序列对齐代码实现进行调整。