2013-11-03 59 views
0

我理解指針非常好,我理解他們的很多用途。不過,我從來沒有想過在數組中使用指針。我知道如何去做,但我不明白爲什麼要直接操作數組。我只想知道我只能用數組中的指針來做的事情。謝謝。數組(C++):爲什麼使用指針直接操作?

+0

如何動態分配多維數組? – Ulterior

+0

「直接操縱」究竟是什麼? – AnT

+0

直接操作:array [0] = 5 –

回答

6

考慮:

struct Match { 
    int scores[30]; 
    char names[30][64]; 
    int ages[30]; 
    char description[1024]; 
}; 

這種結構是3184個字節長。

Match matches[16]; 

如果我決定了比賽[0]和匹配[1]需要進行交換,交換兩個涉及做下面的工作(這是交換是怎樣的std ::實現):

Match temp; // prepare 3184 bytes on the stack. 
temp = matches[0]; // copy 3184 bytes 
matches[0] = matches[1]; // copy 3184 bytes 
matches[1] = temp; // copy 3184 bytes 

這就是很多cpu循環複製/移動數據。

如果我使用的指針:

Match* matches[16]; 
for (size_t i = 0; i < 16; ++i) { 
    mathces[i] = new Match; 
} 

所有的std ::交換所要做的就是交換兩個指針:

Match* temp = matches[0]; // 4 or 8 bytes 
matches[0] = matches[1]; // 4 or 8 bytes 
matches[1] = temp; // 4 or 8 bytes 

更清潔和優化的時候,這大概可以在寄存器中完成極致的表現。

這樣做的另一個優點是內存節省。我可以有一個1,000,000匹配指針的數組,佔用4Mb或8Mb(取決於32/64位),其中很多可以是nullptr。我只需要指向當前有用的條目的指針。

包含1,000,000個匹配對象的數組需要3Gbs的ram。相反,如果所有1,000,000個指針都必須指向唯一的Match對象實例,那麼您將擁有〜3Gb的對象加上〜1Mb的指針。

0

您會發現,數組與對象不同。該數組本身將內存分配爲一個塊。數組然後將指針指向值。這意味着,你可以做array1 = array2。它自己的值不被複制,只有地址。

爲什麼數組是一個指針是因爲內存管理的原因,它很容易複製數組。數組不能像對象一樣工作。

當您訪問數組中的索引1時,您詢問數組:告訴我存儲在此數組的索引1處的地址處的值。雖然我不是C++中最好的特別指針,但我很確定這是它的工作原理。

相關問題