[英]When would you use a vector of shared pointers and when would you use a vector of just plain objects?
我有一個快速的問題。
我前一段時間開始學習C ++,並且始終將向量與對象中的共享指針一起使用。 或至少是智能指針。
我目前正在編寫游戲,正在考慮為什么要使用智能指針。
假設我有一個Game類,並且有一個玩家向量。
我什么時候要為vector<Player> players
選擇,什么時候要為vector<shared_ptr<Player>>
?
如果訪問實體的狀態而不是訪問向量,請使用shared_ptr
。 同樣,如果您進行事件循環,則發生諸如“玩家與其他實體碰撞”之類的事件。 您需要復制一個指針/引用,否則您將無法更改實體的狀態。
另一個重要的事情是,當實體死亡時,卻未處理與該實體的事件 ,因此將該實體從向量中刪除。 當您使用shared_ptr
,實體將繼續存在,直到刪除事件隊列中的事件。 當您將整個玩家存儲在矢量中時,如果矢量更改其大小,則存儲在事件對象中的指針將不再指向正確的實體。 使用shared_ptr
,即使向量中不再存在該實體,也可以正常使用該實體。 但是最好在事件中使用std::weak_ptr
,將其刪除,當實體失效時, weak_ptr
可以檢查指針是否為懸空指針,這意味着實體已失效且無需處理任何事件。
使用實體的向量所處的級別/維度 :當某個實體轉到另一個級別時,需要將實體移動到該級別,復制整個結構不是最好的主意。 因此,最好的辦法是使用諸如shared_ptr之類的指針類型,但是我建議使用std::move
shared_ptr
來減少引用計數的開銷。 使用std::move
,shared_ptr與原始ptr一樣快。
實體的虛擬類 :在2D或3D世界中編寫游戲時,要在向量中存儲許多不同種類的實體,必須使用某種指針類型來引用該對象,因為實體的大小可能不同。
固定玩家人數 :如果您要編程的游戲具有固定的玩家人數(例如紙牌游戲),則不要移動該玩家,也不要刪除該玩家(但是,您可以設置一個標志來表明該玩家已經死亡,而您不需要從向量中刪除實體),最好的方法是使用std::vector<Player>
。
我認為,使用位於向量中的shared_ptr
並在事件中引用weak_ptr
是管理實體的最佳方法。 盡管weak_ptr
(較快的方法)不能使實體的內存保持活動狀態,但每次都需要檢查指針。
if(fixed count of players
&& there are no other entities
&& there are no virtual subclasses of Player) {
class Player { ... };
using player_collection = std::vector<Player>;
using reference_to_player = Player*;
} else {
class Entity { public: ... virtual ~Entity(); };
class Player: public Entity { ... };
using entity_collection = std::vector<std::shared_ptr<Entity>>;
using reference_to_entity = std::weak_ptr<Entity>;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.