簡體   English   中英

指針或結構的向量?

[英]vector of pointers or structs?

說,我定義了一個名為Node的結構(或 class,沒關系)。 在 C++ 中,我們可以使用結構向量或指針向量來存儲許多Node

struct Node {...}
void main() {
    std::vector<Node> nodes;
    // or we can write:
    std::vector<Node*> nodes;
}

據我所知,如果我使用結構向量,那么向量需要一個大的 memory 來將每個整個結構存儲在向量中。 所以我認為指針向量更好。 但是現在我在想,是否有任何我不知道的語法,或者任何迂回的方法來編寫vector<Node>而不是復制向量中的每個結構? 或者更好的是,也許編譯器已經為我做了這個優化?

如果我使用結構向量,則該向量需要一個大的 memory 來將每個整個結構存儲在向量中。

無論您將它們存儲在何處或如何存儲,它們都將占用 memory。 節點必須在 memory 中的某個地方,對嗎? 實際上,指針向量總體上使用了更多的 memory,因為除了實際節點的 memory 之外,您還需要 memory 作為指針。

指針向量有兩個眾所周知的性能缺陷

  • 間接性。 訪問一個元素的意思是:首先從向量中訪問指針,然后從檢索到的地址中訪問元素。
  • 不緩存友好:當您遍歷節點向量時,所有節點都是相鄰的並且一起被放入緩存中。 當您有一個指針向量時,每個節點都可以位於 memory 中的任何位置。 一個元素很少會在緩存中,並且會更快地從緩存中逐出。

這兩者都很重要,並且在大多數情況下都會導致可衡量的性能損失。 所以指針向量對於性能來說幾乎不是一件好事。

其他一些答案提到了搬遷。 然而,這並不像最初看起來那么糟糕。 首先,通過push_back進行的重定位保證具有攤銷常數復雜度。 還有一些簡單的方法可以進一步緩解它們,比如提前預訂。 如果重定位確實是一個問題 - 由分析確定 - 那么更好的選擇可能是std::list

指針向量有一些有效用途,例如需要存儲多態對象。 如果您使用指針,則使用智能指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM