我讀過結構成員不需要在內存中連續。這是否意味着他們可以在記憶中的任意位置,就像他們是不同的變量一樣?如果是這樣,不會使用malloc來爲結構分配空間浪費很多存儲空間?結構元素的內存分配
3
A
回答
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。
相關問題
- 1. 結構的內存分配
- 2. 爲一個malloc中的元素分配結構和內存
- 3. C結構,內存分配和結構
- 4. 內存分配結構
- 5. 爲結構分配內存
- 6. 內存分配和結構
- 7. 在C++中用void *分配內存結構內存分配
- 8. 分配內存內部結構
- 9. 結構內存分配的方式
- 10. C++中的結構內存分配
- 11. 分配內存的指針結構
- 12. 帶結構的動態內存分配
- 13. 結構的C++內存分配
- 14. 結構的內存分配(低性能)
- 15. 變量的塊結構內存分配
- 16. 結構中的內存分配
- 17. 分配內存以包含結構
- 18. C++內存分配器體系結構
- 19. 爲結構數組分配內存
- 20. 嵌套結構內存分配
- 21. 爲結構動態分配內存
- 22. 分配內存和填充結構
- 23. 分配內存並生成結構C
- 24. 內存分配到++結構用C
- 25. 動態分配內存結構c
- 26. 結構和內存分配與循環
- 27. 嵌套結構分配內存
- 28. C結構表動態內存分配
- 29. 爲整個結構向量分配一個結構元素?
- 30. 內存分配和DOM元素
如果一個結構有兩個成員A和B,那麼如果編譯器或程序員不在它們之間添加填充,則A和B都將是連續的。 – arunmoezhi 2014-10-07 04:22:12
@wallyk:你說得對。改寫我的評論 – arunmoezhi 2014-10-07 04:26:37
@arunmoezhi:夠公平的。我刪除了我的評論。 – wallyk 2014-10-07 04:27:17