指针或结构的向量?

时间:2020-07-13 00:40:55

标签: c++ pointers templates struct

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

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

据我了解,如果我使用结构向量,则该向量需要很大的内存才能将每个完整的结构存储在向量中。因此,我认为指针向量更好。但是现在我在想,是否有我不知道的语法,或者有任何回旋方法来写vector<Node>而不复制向量中的每个结构?甚至更好,也许编译器已经为我进行了优化?

1 个答案:

答案 0 :(得分:2)

如果我使用结构的向量,则该向量需要较大的内存才能将每个完整的结构存储在向量中。

无论它们存储在哪里或如何存储,它们都将占用内存。节点必须位于内存中的某个位置,对吗?实际上,指针向量总体上会使用更多的内存,因为除了用于实际节点的内存之外,还需要用于指针的内存。

指针向量

有两个众所周知的性能缺陷

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

这两个都是大问题,在大多数情况下都会导致可衡量的性能下降。因此,指针向量对于性能而言几乎从来不是一件好事。

其他一些答案提到了重定位。但是,这并不像它最初看起来的那样糟糕。首先,保证通过push_back进行的重定位具有摊销后的恒定复杂度。还有一些简便的方法可以进一步减轻这些负担,例如提前预订。如果重新分配确实是一个问题(由配置文件确定),那么更好的选择是std::list

指针向量有一些有效的用法,例如需要存储多态对象。而且,如果您使用指针,请使用智能指针。