我理解指針非常好,我理解他們的很多用途。不過,我從來沒有想過在數組中使用指針。我知道如何去做,但我不明白爲什麼要直接操作數組。我只想知道我只能用數組中的指針來做的事情。謝謝。數組(C++):爲什麼使用指針直接操作?
0
A
回答
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++中最好的特別指針,但我很確定這是它的工作原理。
相關問題
- 1. 使用指針指針數組來操作它指向的指針(C++)
- 2. 爲什麼C++ 11 CAS操作需要兩個指針參數?
- 3. C - 爲什麼指針指針與指向數組的指針不同?
- 4. 爲什麼我不能直接在C中將指針分配給指針?
- 5. 爲什麼在C中使用指針?
- 6. 爲什麼cudaMalloc()使用指針指針?
- 7. 爲什麼我們可以直接拷貝指針,但是我們不能直接拷貝C++的數組
- 8. C:使用void指針數組工作
- 9. 爲什麼使用指針
- 10. 爲什麼這個C函數將一個指針指針作爲參數?
- 11. 爲什麼這個C代碼示例使用指針指針?
- 12. COM互操作和編組指針指向一個接口的指針在C#
- 13. 爲什麼在C++ 11中使用static_cast作爲自動指針?
- 14. gcc使用什麼算法將函數指針轉換爲直接調用?
- 15. 使用指針作爲數組?
- 16. C++指針製作數組
- 17. 爲什麼和什麼時候值得使用指針指針?
- 18. C指針指針數組
- 19. C++將指針傳遞給函數(Howto)+ C++指針操作
- 20. C:使用指針內容作爲數組參數
- 21. C++指針和數組...什麼時候使用[],*和&
- 22. 爲什麼要將DB連接指針對象作爲引用計數指針? (C++)
- 23. 如何使用雙指針作爲指針數組?
- 24. 爲什麼CUBLAS使用const指針作爲參數?
- 25. 爲什麼memcpy使用void指針作爲參數?
- 26. C錯誤:需要作爲一元'&'操作數使用左值(使用指針)
- 27. 爲什麼我不能直接爲指針指定返回的引用?
- 28. 字符指針指針數組用C
- 29. 我爲什麼要在智能指針上使用智能指針作爲C++中的參數引用
- 30. 指針和結構數組操作
如何動態分配多維數組? – Ulterior
「直接操縱」究竟是什麼? – AnT
直接操作:array [0] = 5 –