说,我定义了一个名为Node
的结构(或类,没关系)。在C ++中,我们可以使用结构的向量或指针的向量来存储许多Node
。
struct Node {...}
void main() {
std::vector<Node> nodes;
// or we can write:
std::vector<Node*> nodes;
}
据我了解,如果我使用结构向量,则该向量需要很大的内存才能将每个完整的结构存储在向量中。因此,我认为指针向量更好。但是现在我在想,是否有我不知道的语法,或者有任何回旋方法来写vector<Node>
而不复制向量中的每个结构?甚至更好,也许编译器已经为我进行了优化?
答案 0 :(得分:2)
如果我使用结构的向量,则该向量需要较大的内存才能将每个完整的结构存储在向量中。
无论它们存储在哪里或如何存储,它们都将占用内存。节点必须位于内存中的某个位置,对吗?实际上,指针向量总体上会使用更多的内存,因为除了用于实际节点的内存之外,还需要用于指针的内存。
指针向量有两个众所周知的性能缺陷:
这两个都是大问题,在大多数情况下都会导致可衡量的性能下降。因此,指针向量对于性能而言几乎从来不是一件好事。
其他一些答案提到了重定位。但是,这并不像它最初看起来的那样糟糕。首先,保证通过push_back进行的重定位具有摊销后的恒定复杂度。还有一些简便的方法可以进一步减轻这些负担,例如提前预订。如果重新分配确实是一个问题(由配置文件确定),那么更好的选择是std::list
。
指针向量有一些有效的用法,例如需要存储多态对象。而且,如果您使用指针,请使用智能指针。