读取结构大小时遇到​​麻烦

时间:2015-07-17 16:17:28

标签: c

如果我调试以下代码,那么我看到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

2 个答案:

答案 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)