2014-10-01 92 views
0

考慮一個名爲A的C++類。哪些優點/缺點使用對象的數組:C++,對象數組VS指向這些對象的指針數組

std::array<A, 10> 

,而不是一個指針數組:

std::array<A*, 10> 
+6

你喜歡蘋果還是橙子?這完全取決於你想要做什麼。 – quantdev 2014-10-01 11:09:58

+0

他們完全不同。你怎麼看? – ikh 2014-10-01 11:10:17

+0

如果你從Java到C++,我會建議你閱讀關於指針的教程。這可能會澄清這樣的問題。 – Skaarjasaurus 2014-10-01 11:16:17

回答

7

這裏有重要的區別:

對象的數組:

  • 對象的內存由std::array管理。
  • 對象被存儲在連續的存儲器(良好的緩存效率)
  • 所有的對象都是相同類型的
  • 所有對象存在
  • 分配一個元件使得對象指針的

陣列的副本:

  • 指向的對象的內存不受包含指針的std::array的管理。
  • 可以指針存儲到多態類型的一個共同的基礎
  • 指針可以具有nullptr值即不指向任何對象
  • 分配的元件不會使被指向
所述對象的副本

這些東西中的任何一個是專業版還是騙局都取決於您的使用案例。

現在對於基於意見的部分,作爲初學者的暗示:在我看來,內存由數組管理的事實表明數組「擁有」對象。通常不清楚誰擁有指針指向的對象。所有權的清晰度與高速緩存效率的結合始終是一種獎勵,因此當您不確定時,這些對象陣列是一個很好的默認選擇。如果可以,請在數組中使用對象,當需要時使用指針。當你需要指針時,考慮std::unique_ptr是否合適。

0

,如果你不希望使用STL陣列,您可以使用自己的陣列

1)數組[10]

2)A *陣列[10]

對於#1,類A必須具有默認構造函數。

A needs more memory to hold object 

    Whenever you assigned an object to any index of the array, copy constructor gets called 

    Compilation time required is more 

#2有沒有必要構造

sizeof(array) = size of pointer * 10 

    compilation time required is less 

    There is no need of default constructor or copy constructor 
+0

請您解釋一下,指針數組是如何減少編譯時間的。此外,值得注意的是,如果您使用具有非默認構造函數參數的初始化程序列表(需要支持當前標準的編譯器),則不需要默認構造函數。另外值得注意的是,數組和指向對象組合使用的總內存對於指針數組來說更高。 – user2079303 2014-10-02 07:37:32