如果我调试以下代码,那么我看到size
值为12(正如预期的那样)。
#include <cstdint>
int main(int argc, char *argv[])
{
typedef struct __attribute__((__packed__)) { int8_t value; } time;
typedef struct __attribute__((__packed__)) {
uint8_t msg[8];
// time t1;
uint32_t count;
} theStruct;
theStruct s;
int size = sizeof(s);
return 0;
}
有趣的是,在&#34;时间t1;&#34;删除评论,size
的值变为16.我期待13。
我知道(或多或少)这是由数据结构填充故事解释的......
但是,有什么方法可以避免这个问题吗?
如何阅读size = 13
?
答案 0 :(得分:4)
MinGW对MSVC struct packing的仿真存在一些问题。
解决方法是将-mno-ms-bitfields
标志传递给编译器;这将导致它使用自己的布局算法,而不是尝试模拟MSVC。
另请参阅Struct packing and alignment with mingw(ARM但可能是同一个问题)。
答案 1 :(得分:0)
这显然是一个对象问题,这意味着它与语言本身无关,但与底层平台无关。
如果平台知道(或认为)int32_t
需要一个4的对齐,它应该在一段时间后添加3个字节的填充。
无论如何__attribute__((__packed__))
是非标准C,只能用gcc(*)来解释。更糟糕的是它会导致不可移植的程序:根据this answer在另一个问题上,由于int32_t未对齐,它会导致Sparc架构出现总线错误。
我知道x86(及衍生产品)架构现在是最常见的,但其他架构可能仍然存在......
(*)根据Visual C++ equivalent of GCC's __attribute__ ((__packed__)),MSVC等效值为#pragma pack(push, 1)