C ++使用指向指针向量的指针的任何好处?

时间:2017-04-01 08:31:57

标签: c++ pointers vector unordered-map

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

Memory consumption of a pointer to vector of pointers

Pointer to vector vs vector of pointers vs pointer to vector of pointers

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

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

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

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

vector<object*> *myVector;

一切都进入了堆。

然而,如果我使用它会发生什么:

vector<object*> myVector;

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

此外,如果我使用它:

vector<object> *myVector;

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

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

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

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

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