2014-11-13 102 views
0

我创建一个结构用下面的代码:固定宽度STRUCT C++

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

我需要我的结构是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个字节。我一直无法解决这种情况。

+4

填充和对齐问题。 [编译指南(1)修复](http://coliru.stacked-crooked.com/a/f09c137a6ad34250) – Borgleader

+2

填充和对齐问题可以通过编译器特定的编译指示来解决。 –

+0

@Borgleader我打算把它放在答案中,但是你先打电话给你,这样你才能回答。 –

回答

3

您正在遇到填充和对齐问题。不同的类型有不同的要求。您可以使用编译器编译特定收拾你的会员和解决这个问题:

#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(你有),以及32条(如你预期)。 See on Coliru

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)来访问结构的成员。