2012-04-05 101 views
1

我有一個名爲GameObject的基類,其他類從其派生。 我想知道是否通過在連續內存中分配GameObjects的所有派生類來處理內存分配將提高性能。C++ - 連續內存和多態性

我將最終遍歷所有的遊戲引擎框架。

我的問題是,在這種情況下連續內存存儲器是否比沒有連續性的mallocing內存更快的迭代次數?在這兩種情況下,我必須保留指向遊戲對象的向量,因爲它們的大小會有所不同。

+2

它可能會提高性能,至少有點。不過請記住這個黃金法則,在分析之前不要優化。如果您認爲這是緩存未命中的來源,則可以始終重載類的'operator new'。 – enobayram 2012-04-05 18:53:37

+1

使用連續內存*可能會提高緩存命中率,因此您的代碼*可能會變得更快。然而,直到你做了一些分析,它仍然是另一個過早優化的例子。 – dasblinkenlight 2012-04-05 18:54:07

回答

0

對連續內存中的對象進行迭代可能效果更好,因爲緩存和局部性。但是,我建議您構建兩個系統並實際對其進行配置。祝你好運!

+0

即使對象的大小可能有所不同?理論上它會超過保持連續性所需的額外開銷嗎? – KaiserJohaan 2012-04-05 19:02:37

0

我不確定我是否理解這個問題。你問是否更好地將所有對象預先分配在一個巨大的內存塊中,並將指針的內容存儲在內存中?如果是這樣,請不要這樣做。

由於系統必須請求較大塊的連續內存,而不是不連續的較小塊,因此您可能不必越快速就越慢。請記住塊分配,分頁等。您可能要求100兆字節的連續內存,但實際上它不是連續的。一堆它在磁盤中,反正一切都被分解成頁面。

那麼你面臨的問題是你是否一次性分配所有的GameObjects以獲得連續的內存,或者你是否按需創建它們?你真的想預先分配這個小優化嗎?如果您需要創建一個新對象並且連續內存塊不夠大,會發生什麼情況?等

真的,我只是頭腦風暴這裏的潛在問題。就像其他評論說的那樣,一個過早優化的案例。

現在,如果將所有指針存儲在連續數組中,而不是根據當前大小增長並複製的矢量,它肯定會更快,但即使如此,除非您完全知道遊戲對象的數量最好只分配一個足夠大的矢量,以便它只增長一次或兩次。