固定宽度的结构c ++

时间:2014-11-13 17:32:57

标签: c++ c struct

我使用以下代码创建了一个结构:

struct d_entry{
   bool _free;
   char name[10];
   bool _dir;
   time_t _cDate;
   unsigned short _cluster;
   char reserved[6];
   unsigned int _size;      
};

我需要我的struct具有32字节的固定大小。根据我的计算机,以下类型(结构外)具有以下大小。

sizeof(bool) = 1 byte
sizeof(char) = 1 byte   
sizeof(time_t) = 8 bytes   
sizeof(short) = 2 bytes  
sizeof(int) - 4 bytes

当我运行任何d_entry的大小时,大小为40个字节。出于某种原因,time_t和long类型被解释为16个字节。我无法解决这种情况。

2 个答案:

答案 0 :(得分:4)

您正在遇到填充和对齐问题。不同类型有不同的要求。您可以使用编译器特定的pragma打包您的成员并克服此问题:

#include <iostream>

struct foo{
   bool _free;
   char name[10];
   bool _dir;
   time_t _cDate;
   unsigned short _cluster;
   char reserved[6];
   unsigned int _size;      
};

#pragma pack(1)
struct bar{
   bool _free;
   char name[10];
   bool _dir;
   time_t _cDate;
   unsigned short _cluster;
   char reserved[6];
   unsigned int _size;      
};

int main()
{
    std::cout << sizeof(foo) << std::endl;
    std::cout << sizeof(bar) << std::endl;

    return 0;
}

foo的大小为40(如你所示),bar为32(如你所料)。 See on Coliru

答案 1 :(得分:1)

正如Borgleader指出的那样,您正在体验数据结构填充。

作为#pragma pack(1)的替代方法,您可以使用gcc关键字__attribute__来指定结构不应该有填充。

struct d_entry{
   bool _free;
   char name[10];
   bool _dir;
   time_t _cDate;
   unsigned short _cluster;
   char reserved[6];
   unsigned int _size;      
}__attribute__(( packed ));

通常,在打包结构时,您应确保仅通过.->访问结构的成员(请参阅this post)。