指针或结构的矢量

vector of pointers or structs?

本文关键字:结构 指针      更新时间:2023-10-16

比方说,我定义了一个名为Node的结构(或类,无关紧要(。在C++中,我们可以使用结构向量或指针向量来存储许多Nodes。

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

据我所知,如果我使用结构的向量,那么向量需要一个大内存来存储向量中的每个完整结构。所以我认为指针向量更好。但现在我在想,有没有我不知道的语法,或者任何迂回的方法来编写vector<Node>,同时不复制向量中的每个结构?或者更好的是,也许编译器已经为我做了这个优化?

如果我使用结构的向量,那么向量需要一个大内存来存储向量中的每个完整结构。

无论您将它们存储在何处或以何种方式,它们都会占用内存。节点必须在内存中的某个位置,对吧?实际上,指针的矢量总体上使用了更多的内存,因为除了实际节点的内存之外,还需要指针的内存。

指针向量有两个众所周知的性能缺陷

  • 间接。访问元素意味着:首先从向量访问指针,然后从检索到的地址访问元素
  • 不支持缓存:当您在一个节点向量上迭代时,所有节点都是相邻的,并一起放入缓存中。当您有一个指针向量时,每个节点都可以位于内存中的任何位置。元素很少在缓存中,并且会更快地从缓存中逐出

这两者都是一件大事,在大多数情况下都会带来可衡量的性能打击。因此,指针的矢量对性能来说几乎从来都不是一件好事。

其他一些答案提到了搬迁。然而,这并不像最初看起来那么糟糕。首先,通过push_back的重新定位保证具有分摊的恒定复杂性。还有一些简单的方法可以进一步缓解这种情况,比如提前预订。如果重新定位确实是一个问题——由分析决定——那么更好的选择可能是std::list

指针的矢量有一些有效的用途,比如需要存储多态对象。如果你使用指针,那么就使用智能指针。