【发布时间】:2017-08-26 13:06:36
【问题描述】:
在开始之前,我已经看过这些问题:
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<vector<int>>> *myVector;
所有内部向量是否都存储在堆上?如果是,那么在析构函数中删除myVector 就足够了,不用担心其他任何事情?
无论如何,我假设所有适用于vector 的答案也适用于unordered_map。如果我错了,请告诉我。
提前致谢。
【问题讨论】:
-
即使对于
vector<object> myVector,您放入向量中的元素也存储在免费存储中(在您的示例中为堆)。 -
@GillBates 很有趣,所以如果我使用
vector<object> *myVector一切都会进入堆?我不希望将向量存储在堆栈中,因为它可能具有很大的大小,并且我不想更改堆栈大小。但我不知道任何向量中的对象都在堆上。 -
你的向量是否以巨大的尺寸存储在堆栈中并不重要。仅仅因为它包含很多元素不会使它在堆栈上变得更大,它只是具有可以忽略不计的簿记成员,只需将其保留在那里并使用
<object>进行分配。 -
你可以试试
sizeof(vector<object>)、sizeof(vector<object*>)和sizeof(vector<vector<vector<int>>>),看看它们的大小都一样。而且相当小。
标签: c++ pointers vector unordered-map