2012-08-03 61 views
1

讓我更清楚, 我想填充一個內部結構我該怎麼做..?例 -如何打包結構內部的結構

其中struct b

struct b{ 
    u_int32_t aa; 
    u_int32_t bb; 
}; 

struct c{ 
    u_int64_t cc; 
}; 

現在,我的編譯器操作的方式的結構b和c以struct d之間8字節的填充。那麼,我如何擺脫這一點?

希望,現在清楚。有人可以給我一個答案嗎?

結構d {

struct b; 

struct c; //I want to make this structure a padded one, how to go about it? 

struct c; 

} 

請,有人可以幫助我。

+0

[C結構的填充(http://stackoverflow.com/questions/4128061/c-struct-padding) – 2012-08-03 03:55:34

+0

您正在使用什麼編譯器可能重複? GCC使用'__attribute__',而MSVC使用'#pragma'。 – 2012-08-03 04:00:04

回答

2

從標籤,我推斷你在Linux上。 GCC認識到以下屬性:

__attribute__((packed)) 

您可以在結構聲明之前或之後寫入以刪除填充。

0

事實上,它不會在b和c之間放置任何填充

讓我們來看看爲什麼,

所有u_int32_t都是32位=> 4個字節。現在struct b的大小將是8個字節(4個因爲aa和4個因爲bb)。而且,struct c的大小也是8個字節。

因此當製作struct d時,struct bstruct c都依次放置。接下來的struct c被放置在之前的struct c之後。

但是在最終的struct cstruct d的關閉之後有8個字節的填充。這是因爲,如果將多個struct d放置在內存中,則第二個struct d將最終從內存位置24開始,而不是32(這很方便)。

如果您想了解更多信息:The Lost Art of C Structure Packing