【问题标题】:C++ Any benifits using pointer to vector of pointers?C++ 使用指向指针向量的指针有什么好处?
【发布时间】: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&lt;object&gt; myVector,您放入向量中的元素也存储在免费存储中(在您的示例中为堆)。
  • @GillBates 很有趣,所以如果我使用vector&lt;object&gt; *myVector 一切都会进入堆?我不希望将向量存储在堆栈中,因为它可能具有很大的大小,并且我不想更改堆栈大小。但我不知道任何向量中的对象都在堆上。
  • 你的向量是否以巨大的尺寸存储在堆栈中并不重要。仅仅因为它包含很多元素不会使它在堆栈上变得更大,它只是具有可以忽略不计的簿记成员,只需将其保留在那里并使用&lt;object&gt; 进行分配。
  • 你可以试试sizeof(vector&lt;object&gt;)sizeof(vector&lt;object*&gt;)sizeof(vector&lt;vector&lt;vector&lt;int&gt;&gt;&gt;),看看它们的大小都一样。而且相当小。

标签: c++ pointers vector unordered-map


【解决方案1】:

一般来说,std::vector 的元素将总是在堆上动态分配。对于大多数实现,std::vector&lt;T&gt; foo,其中T 可能是指针,也可能不是指针,堆栈上总会有三个指针来描述向量本身,而不是元素。对于std::vector&lt;T&gt; *bar,堆栈上有一个指针bar。三个向量指针以及向量元素都在堆上。

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

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

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

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 2019-09-10
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多