2017-07-07 45 views
4

編程遊戲時,我用來將所有遊戲對象存儲在具有初始化和固定大小的std :: vector中。最近我覺得需要在遊戲對象類中進行一些繼承。用於C++中不同派生類的高效容器

所以我們假設我有40個類從我的敵人派生出來。如果我想將這些類的對象/實例存儲在一個向量中,我只能選擇將它們存儲爲向量Enemy *對嗎?所以連續分配的唯一東西就是指針,對吧?所以當這些需要被解除引用時,我仍然會有很多緩存未命中,對吧?

是否有任何「最佳實踐」的方式,將派生類存儲在合理分配的內存中,以便循環遍歷它們需要最少的時間?

+1

我認爲他在談論類實例。這似乎很明顯。 – TinkerTenorSoftwareGuy

+0

我指的是這些類的對象。實例。在運行時創建並分配的東西。 – user3808217

+0

使用指向基類內的向量,或者如果它更合適,某種智能指針。 – Klaus

回答

2

Boost剛剛接受了一個圖書館正是爲了這個目的:poly_collection。特別是,您正在尋找base_collection

在內部,它使用多個向量,每個(派生)類型一個,同時提供接近標準容器的接口。

This article作者提供了一些設計背景和其他解決方案的比較,如向量unique_ptr。優點有兩方面:第一,通過不使用指針和每個元素的動態內存分配,您擁有更好的內存局部性;第二,將相同類型的元素分組在一起,you help branch prediction和虛擬成員函數的指令緩存。