2012-11-03 72 views
1

更好的是 -使用類對象:: vector的

std::vector<MyClass*> 

std::vector<MyClass> 

? 我的意思是,第二個選項是否會將對象存儲在堆中呢? 哪一個更快更清潔?

+3

這很大程度上取決於您的要求。至於使用原始指針,你應該儘可能地避免它,而不是像['std :: shared_ptr'](http://en.cppreference.com/w/cpp/memory/shared_ptr)這樣的智能指針。 –

回答

4

std::vector<MyClass>在大多數情況下更可取。是的,默認情況下它會將對象存儲在堆中(動態存儲)std::allocator

優點是對象在矢量銷燬時自動銷燬,並分配在單個連續內存塊中,減少堆碎片。所以這樣更乾淨。

這種方式更快,因爲它可以最大限度地減少內存分配操作。向量將在構造對象之前預先分配存儲空間,因此對於N個對象,它將是M分配操作和N構造函數調用,N> M(N越大,差異越大)。如果手動創建對象並通過指針將它們放到向量中,則會導致M分配和N個構造,M = N + X,其中X是向量存儲分配。如果知道存儲對象的數量,則總是可以最小化向量內存分配 - 使用std::vector::reserve()

相反,使用指針的std::vector將要求您手動銷燬對象,例如,爲動態分配的對象調用delete。這不被推薦。此類容器只能用作非擁有。在這種情況下,對象所有權應在外部維護。

4

是的,第二個版本也會將對象存儲在堆上,但是格式更緊湊,即數組MyClass

在第一種形式,你必須分配解除分配你的對象,而std::vector將在第二個版本爲你做這個。

因此,一如既往,這取決於您的需求和要求。如果可以選擇,採取第二種形式:

std::vector<MyClass> 

它更容易維護。

0

取決於。當然,將類的副本存儲在容器中更容易處理,但每次都需要運行復制構造函數以將實例保存到容器中,這可能會造成問題。另外,你的容器不能存儲除了那個類之外的任何東西 - 特別是它不能存儲從你的基類中專用(繼承)的其他類。所以,一般來說,你通常最終不得不存儲指向類的指針。

有存儲指針的障礙。但是,爲了獲得兩全其美的好處,可以考慮使用boost :: ptr_vector,它具有智能指針的優點,而無需額外開銷。

+0

'但你需要每次都運行拷貝構造函數來將實例保存到可能有問題的容器中,否則你不需要。僅在調整大小時才複製構造函數,否則將進行復制分配。甚至在大多數情況下你都會得到移動建築。另外,由於在C++中並沒有使用非常多的繼承(相比之下,你實際上無法解決它的Java),支持它的要求也不會隨時彈出。 – Cubic

0

std::vector<MyClass>將存儲對象堆(可能),std::vector<MyClass*>將存儲您的指針堆(可能)和你的對象,無論他們創建。如果您需要在適用時再次支持繼承std::vector<std::unique_ptr<MyClass>>,則適用時使用std::vector<MyClass>。如果你的向量不應該擁有這些對象,那麼std::vector<MyClass*>可能會有用,但很少有這種情況。