【发布时间】:2020-11-02 04:12:51
【问题描述】:
说,我定义了一个名为Node 的结构(或类,没关系)。在 C++ 中,我们可以使用结构向量或指针向量来存储许多 Nodes。
struct Node {...}
void main() {
std::vector<Node> nodes;
// or we can write:
std::vector<Node*> nodes;
}
据我所知,如果我使用结构向量,那么向量需要大内存来存储向量中的每个整个结构。所以我认为指针向量更好。但现在我在想,是否有任何我不知道的语法,或者任何迂回的方法来编写vector<Node>,而不复制向量中的每个结构?或者更好,也许编译器已经为我做了这个优化?
【问题讨论】:
-
当向量拥有它的对象时,首选
std::vector<std::unique_ptr<Node>>而不是std::vector<Node*>,如果它被用作std::vector<Node>的替代品就是这种情况。std::vector<Node>可能没问题,具体取决于Node对象的预期数量及其大小。 -
如果有大量
Nodes,它们必须存在于某个地方。指针必须指向某物。使用指向对象的指针向量而不是对象本身不会改变这一点。话虽如此,重新分配小指针向量与向量大对象相比,肯定会有所不同。但是您必须完全理解其含义,特别是在对象生命周期方面。否则,你最终会到处泄漏内存,而且会有很多好处。 -
在 Ubuntu 20.04 上使用 g++ 9.3.0,“std::vector
tVec;”占用 24 个字节,无论 sizeof(T) 和元素数量如何(即 tVec.size())。 [注意:一些向量实现不同。] 这意味着 tVec 的元素驻留在堆中,而 std::vector 负责指针和向量大小的增长。这意味着所使用的“大内存”(用于许多大 T 的)不在您系统的堆栈中。您对指针(或 smart_ptrs)的使用可能会浪费您的时间,并且操作起来会有些慢。
标签: c++ pointers templates struct