C++ 使用指针指向指针向量有什么好处吗?

C++ Any benifits using pointer to vector of pointers?

本文关键字:指针 什么 向量 C++      更新时间:2023-10-16

在我开始之前,我已经看过这些问题:

指向指针向量的指针的内存消耗

指向矢量的指针与指向指针的矢量 vs 指向指针的矢量的指针

他们都没有回答我的问题。


我正在从事一个涉及数百万个实例的项目。

我使用的数据结构第一次看有点复杂,结构本身对这个问题并不重要。

现在,如果我有以下内容:

vector<object*> *myVector;

一切都进入了堆。

但是,如果我使用它会发生什么:

vector<object*> myVector;

向量本身是否存储在堆栈上?然后它的内容存储在堆上?例如,如果向量有 1000 万个实例,我是否会在堆栈上有 1000 万个引用,用于堆上的 1000 万个对象?还是我错过了什么?

此外,如果我使用这个:

vector<object> *myVector;

矢量的内容去哪儿了?一切都在堆上吗?如果是,那么它是否递归工作?例如:

vector<vector<vector<int>>> *myVector;

然后所有内部向量都存储在堆上吗?如果是,那么在析构函数中删除myVector就足够了,而不必担心其他任何事情?

无论如何,我假设所有适用于vector的答案也适用于unordered_map。如果我错了,请告诉我。

提前谢谢。

通常,std::vector的元素将始终在堆上动态分配。对于大多数实现,std::vector<T> foo,其中T可以是指针,也可以不是指针,堆栈上总是有三个指针描述向量本身,而不是元素。对于一个std::vector<T> *bar,堆栈上有一个指针,bar。三个矢量指针以及矢量元素都在堆上。

类似地,对于一个std::unordered_map,元素本身将始终在堆上动态分配。通常,具有Allocator模板参数的任何 std 类型或包含可变数据量的任何类型都将在堆上动态分配其数据。

现在有一些特殊情况,例如自定义分配器、奇怪的优化、术语的细节,但出于实际目的,这是您应该知道的。

您可能想要了解的下一件事是智能指针,例如std::unique_ptrstd::shared_ptr,所有权语义和RAII。为了编写正确的代码,了解这一点实际上更为重要(我需要删除和担心什么?

相关文章: