2013-11-25 142 views
3

我在我的代碼中有一個struct iof_header,我確定它的寬度是24個字節。我執行一個sizeof(iof_header),它返回32個字節寬。結構如何存儲在內存中?

問題1 爲什麼它是32字節寬而不是24?

問題2 包括它的成員,結構如何存儲在內存中?

問題3 我發現我創建字節我的結構之一[4-8 & 20-24]都爲NULL的任何時間,我看到這種明顯的在我的字符數組。該陣列的內容如下{4 bytes of BASEID_Code, 4 NULL bytes, 8 bytes of zeroed padding, 4 bytes of ASID_Code, 4 NULL bytes, 8 bytes of size} 我的unsigned __int32成員末尾有空字節,爲什麼會發生這種情況?

這可能與編譯有關嗎?可能是使CPU能夠更快地處理這些數據類型的一項有效工作?

struct      iof_header 
{ 
    union 
    { 
     struct 
     { 
      unsigned __int32  BASEID_Code; 
      unsigned __int64  padding; 
      union 
      { 
       char     ASID_Type[4]; 
       unsigned __int32  ASID_Code; 
      }; 
      unsigned __int64  Size; 
     }header; 
     char     header_c[24]; 
    }; 
    iof_header() 
    { 
     header.ASID_Code = 0; 
     header.BASEID_Code = 0; 
     header.Size = 0; 
     header.padding = 0; 
    } 
}; 
+10

某物和一個char [32]的'union'怎麼能有小於32字節的大小? –

+1

去閱讀這個externation-http://en.wikipedia.org/wiki/Data_structure_alignment – OldProgrammer

+0

這已被問及已答覆一百萬次。你所有的三個問題。如果有的話,你應該發佈_separately_。 –

回答

5

爲什麼它是32字節而不是24字節?

可能是因爲在每個__int64成員之前添加填充以滿足其對齊要求。

包括它的成員,結構如何存儲在內存中?

成員存儲在順序,填充插入在必要時每個相對於所述結構的起始部件正確對齊。

有些編譯器有一個非標準擴展名來「包裝」成員,所以不插入填充。例如,在GCC上,可以在結構定義之後放置__attribute__((packed))

可能是使CPU能夠更快地處理這些數據類型的一種有效方法嗎?

是的。在某些處理器上,未對齊的訪問速度很慢;在別人身上,他們根本不被允許,必須通過兩次或多次訪問來模擬。

+0

謝謝,這幫助我瞭解了很多。我通過試驗和錯誤修復了一些問題。 –

2

編譯器可以在成員之後自由添加填充字節以保留對齊要求。您的__int64成員可能會對齊到8個字節,請參閱BASEID_Codepadding之間的4個填充字節。