2014-11-21 60 views
4

這是一個基本問題,但我找不到明確的答案。希望有人能夠闡明一些看法。陣列佔用的內存空間

我想知道一個數組佔用多少內存空間。

做多個不同類型的數組,但具有相同的組合字節大小佔用相同數量的內存?

數組是否佔用與多個相同大小的數組相同的內存空間?

一些例子:

(在我的系統8051微控制器, char = 1 byte; int = 2 bytes ; float = 4 bytes;

//case 1 
char array_nr1[40]; 

//case 2 
char array_nr1[10]; 
char array_nr2[10]; 
char array_nr3[10]; 
char array_nr4[10]; 

//case 3 
int array_nr1[10]; 
int array_nr2[10]; 

//case 4 
float array_nr1[10]; 

//case 5 
char array_nr1[10]; 
int array_nr2[5]; 
float array_nr3[5]; 

做對照組5例採取的內存(40個字節)一樣多嗎?是否有任何其他數據存儲在內存中(例如陣列基地址)

謝謝。

+5

沒有任何「填充」,「優化」和「包裝」,理論上,是的。 – 2014-11-21 12:14:19

+0

「一個案件」到「記憶」是什麼意思?如果每個對象都有存儲空間,則每個對象都需要內存,但是否需要任何內存取決於您的操作。如果該對象從未被引用,編譯器可能會選擇不爲其分配任何存儲。你可以問的唯一明智的事情是每個對象的*大小*。 – 2014-11-21 12:17:23

+0

你確定你是正確的嗎? int通常需要4個字節的空間,所以每個10個int的兩個數組需要80個字節,而不是40個 – 2014-11-21 12:17:56

回答

4

數組佔用的內存可以通過使用sizeof運算符獲得。例如

char array_nr1[40]; 

printf("%zu\n", sizeof(array_nr1)); 

的輸出將是40,因爲sizeof(char)在所述陣列的所述元件的大小被保證是等於1

你可以寫入相同的,例如用於陣列

int array_nr1[10]; 

但是,通過將元素的sizeof乘以元素numkber來計算數組的大小會更好。

所以這個記錄

sizeof(array_nr1) 

相當於

10 * sizeof(int) 

所以,問題是什麼是int類型的對象的大小?這取決於實施。例如sizeof(int)可以等於2或4或其他值。

所以你的情況如果sizeof(int)等於2,那麼這兩個數組

int array_nr1[10]; 
int array_nr2[10]; 

佔據2 * (10 * sizeof(int)) => 40個字節。它是受陣列的佔有

char array_nr1[40]; 

如果sizeof(int)等於4,則陣列佔據不同量的存儲器中的相同存儲容量。

相同的觀察結果對float類型的數組有效。通常float類型的對象的字節大小等於4。因此,如果sizeof(int)等於2,那麼這些陣列

char array_nr1[10]; 
int array_nr2[5]; 
float array_nr3[5]; 

occuoy相同量的存儲器陣列

char array_nr1[40]; 

因爲

10 *的sizeof(char)的+ 5 *的sizeof(int)的+ 5 * sizeof(float)=> 10 * 1 + 5 * 2 + 5 * 4 => 40個字節。