2014-11-13 107 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)來訪問結構的成員。