2014-10-07 114 views
3

我讀過結構成員不需要在內存中連續。這是否意味着他們可以在記憶中的任意位置,就像他們是不同的變量一樣?如果是這樣,不會使用malloc來爲結構分配空間浪費很多存儲空間?結構元素的內存分配

+0

如果一個結構有兩個成員A和B,那麼如果編譯器或程序員不在它們之間添加填充,則A和B都將是連續的。 – arunmoezhi 2014-10-07 04:22:12

+0

@wallyk:你說得對。改寫我的評論 – arunmoezhi 2014-10-07 04:26:37

+0

@arunmoezhi:夠公平的。我刪除了我的評論。 – wallyk 2014-10-07 04:27:17

回答

3

雖然成員不一定是連續的,但它們也不在任意的內存位置。舉個例子來說,下面的定義:

struct MyStruct 
{ 
    char foo; 
    int bar; 
}; 

假設sizeof(int) == 4,然後foo將在偏移0和bar在偏移4(被適當地對準)。所以整個結構將是8個字節,即使它可以適應5個。但是,對於這個結構的每個實例,這些偏移總是相同的。所以要回答你的問題malloc,不,它不會浪費空間。就分開的變量而言,是的,它們可能位於內存中的不同位置,但是結構的整個點是將相關變量分組。因此,同一個結構實例的所有成員將緊密地組合在一起。

3

根據CPU體系結構,可能需要正確對齊結構成員,例如4字節成員的地址應該可以被4整除。有些CPU不需要這種對齊,但是很多都可以。如果您嘗試使用不正確對齊的數據執行某些操作,某些CPU會崩潰,而其他CPU則會崩潰,但訪問不正確對齊的數據會非常慢。

彙編程序員需要擔心這個問題,但是C程序員通常可以把雜亂的細節留給編譯器。但它意味着結構可以包含「不可見」填充以確保正確對齊。這種填充不會浪費太多空間,並且可以通過良好的結構成員佈局來最大限度地減少浪費的空間。請注意,此填充也會發生在堆棧中爲您的函數創建的變量上。請參閱Data structure alignment