指针或结构的矢量
vector of pointers or structs?
比方说,我定义了一个名为Node
的结构(或类,无关紧要(。在C++中,我们可以使用结构向量或指针向量来存储许多Node
s。
struct Node {...}
void main() {
std::vector<Node> nodes;
// or we can write:
std::vector<Node*> nodes;
}
据我所知,如果我使用结构的向量,那么向量需要一个大内存来存储向量中的每个完整结构。所以我认为指针向量更好。但现在我在想,有没有我不知道的语法,或者任何迂回的方法来编写vector<Node>
,同时不复制向量中的每个结构?或者更好的是,也许编译器已经为我做了这个优化?
如果我使用结构的向量,那么向量需要一个大内存来存储向量中的每个完整结构。
无论您将它们存储在何处或以何种方式,它们都会占用内存。节点必须在内存中的某个位置,对吧?实际上,指针的矢量总体上使用了更多的内存,因为除了实际节点的内存之外,还需要指针的内存。
指针向量有两个众所周知的性能缺陷:
- 间接。访问元素意味着:首先从向量访问指针,然后从检索到的地址访问元素
- 不支持缓存:当您在一个节点向量上迭代时,所有节点都是相邻的,并一起放入缓存中。当您有一个指针向量时,每个节点都可以位于内存中的任何位置。元素很少在缓存中,并且会更快地从缓存中逐出
这两者都是一件大事,在大多数情况下都会带来可衡量的性能打击。因此,指针的矢量对性能来说几乎从来都不是一件好事。
其他一些答案提到了搬迁。然而,这并不像最初看起来那么糟糕。首先,通过push_back的重新定位保证具有分摊的恒定复杂性。还有一些简单的方法可以进一步缓解这种情况,比如提前预订。如果重新定位确实是一个问题——由分析决定——那么更好的选择可能是std::list
。
指针的矢量有一些有效的用途,比如需要存储多态对象。如果你使用指针,那么就使用智能指针。
相关文章:
- 如何在 C# 中映射双 C 结构指针?
- C++:映射结构中的结构指针
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 类的静态结构指针声明在C++
- 在两个.cpp文件之间定义全局类/结构指针
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 是否可以将无符号字符数组reinterpret_cast到仅包含C++中无符号字符成员的结构指针
- 如何在地图中使用结构指针
- 结构指针在"新"调用上给出已分配的地址?
- 铸造结构指针指向C 的工会指针
- c++ 结构指针在初始化为 NULL 时无法读取内存
- 函数中的结构指针的地址为0x1
- C 用结构指针初始化结构
- C 结构指针铸成数组Interop C#
- 方法中不允许访问结构指针
- 如何打印出结构指针
- MPI_Op_create:候选功能不可行.自定义结构指针不能解释为空指针
- 尝试将结构指针传递给类时出错
- 初始化结构指针的值
- 使用 pybind11 将自定义结构(指针向量)从 C++ 传递到 python 的方法是什么?