2014-07-22 55 views
1

我試圖打包一個結構,使用g ++在 64位 32位窗口。C/C++結構打包不起作用

struct Foo 
{ 
    uint8_t a; 
    uint32_t b; 
} __attribute__((packed)); 


int main(int argc, char *argv[]) 
{ 
    qDebug() << "sizeof(Foo):" << sizeof(Foo); 
    return 0; 
} 

此輸出8.其他的事情我已經試過:

{ uint8_t a; } // Gives 1, correct. 
{ uint8_t a; float b; } // Gives 8, expected 5. 
{ uint8_t a; uint16_t b; } // Gives 4, expected 3. 
{ uint16_t a; uint8_t b; uint8_t c; } // Gives 4, correct. 

所以看起來像結構包裝,但sizeof在某些情況下,圍捕? (其實在寫完這個問題之後,我想我可以回答它,但無論如何我都會爲後人發佈它。)

編輯:其實我不知道。我認爲aligned(1)會解決它,但它不會。

+0

如果你能回答它,繼續前進。 – chris

+1

@Timmmm如果你使用'#pragma pack(1)'編碼。 – Sathish

+0

如果你想讓它們更小,可以嘗試在結構體中放置最後一個較小的類型。 –

回答

2

終於發現它是a bug in g++

一般的問題是,屬性((__packed))僅適用於 結構的最後一個字段。這是9尺寸的原因。特技是 這裏'#pragma pack(1)'。通過它你會得到預期的尺寸。問題是 即使對結構體/聯合體標記的 進行打包(或通過-fpack-struct選項),也會應用此字段對齊。

那麼有似乎是這種解釋有些懷疑,但解決方案的工作 - 用#pragma pack(1),而不是像這樣:

#pragma pack(1) 

struct Foo 
{ 
    uint8_t a; 
    uint32_t b; 
}; 

#pragma pack() 

第二#pragma復位包價值。

+1

這是一個從MinGW(明顯)g ++ 4.7開始的bug。我有正確的大小與g ++ 4.6.2,我剛剛升級到4.8.1,現在我得到錯誤的大小。 – Holt

+1

查看上游的gcc錯誤:https://gcc.gnu.org/bugzilla/show_bug.cgi?id = 52991 – benjarobin

0

應該是5包裝時,對我的作品上

Linux版本的3.13.0-32泛型(buildd @ kissel)(gcc版本4.8.2 (Ubuntu的4.8.2-19ubuntu1)) #57,Ubuntu的SMP週二7月15日3時51分08秒UTC 2014

#include <iostream> 
using namespace std; 

struct Foo 
{ 
unsigned char a; 
unsigned int b; 
} __attribute__((packed)); 


int main(int argc, char *argv[]) 
{ 
cout << "sizeof(Foo):" << sizeof(Foo); 
return 0; 
} 

成功 評論(0) 標準輸入 複製

標準輸入是空

標準輸出 副本

的sizeof(美孚):5

Compiled on Ideone