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

C++ C++;使用指针向量的指针有什么好处吗?,c++,pointers,vector,unordered-map,C++,Pointers,Vector,Unordered Map,在开始之前,我已经研究了以下问题: 他们都没有回答我的问题 我正在从事一个项目,其中涉及数百万个实例 我第一次使用的数据结构有点复杂,结构本身对于这个问题来说并不重要 现在,如果我有以下几点: vector<object*> *myVector; vector*myVector; 一切都糟透了 但是,如果我使用此选项,会发生什么情况: vector<object*> myVector; vector<object> *myVector; 向量my

在开始之前,我已经研究了以下问题:

他们都没有回答我的问题


我正在从事一个项目,其中涉及数百万个实例

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

现在,如果我有以下几点:

vector<object*> *myVector;
vector*myVector;
一切都糟透了

但是,如果我使用此选项,会发生什么情况:

vector<object*> myVector;
vector<object> *myVector;
向量myVector;
向量本身是否存储在堆栈上?然后它的内容存储在堆上?例如,如果向量有1000万个实例,堆上1000万个对象的堆栈上会有1000万个引用吗?还是我遗漏了什么

此外,如果我使用这个:

vector<object*> myVector;
vector<object> *myVector;
vector*myVector;
向量的内容到哪里去了?所有的东西都堆起来了吗?如果是,那么它是递归工作的吗?例如:

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

无论如何,我假设所有适用于
向量的答案也适用于
无序映射。如果我错了,请告诉我


提前感谢。

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

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

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


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

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

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

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


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

即使对于
vector myVector
来说,你放入向量的元素也存储在免费存储中(在你的例子中是堆)。@GillBates很有趣,所以如果我使用
vector*myVector
所有东西都会进入堆?我不希望向量存储在堆栈上,因为它可能有很大的大小,我不想更改堆栈大小。但是我不知道任何向量中的对象都在堆上,不管向量是否以很大的大小存储在堆栈上。仅仅因为它包含了很多元素并不会使它在堆栈上变得更大,它只是有一些可以忽略不计的簿记成员,只需将其保留在那里并使用
进行分配。您可以尝试
sizeof(vector)
sizeof(vector)
sizeof(vector)
并查看它们的大小是否相同。而且相当小。即使对于
vector myVector
来说,你放入向量中的元素也存储在免费存储中(在你的例子中是堆)。@GillBates很有趣,所以如果我使用
vector*myVector
所有东西都进入堆?我不希望向量存储在堆栈上,因为它可能有很大的大小,我不想更改堆栈大小。但是我不知道任何向量中的对象都在堆上,不管向量是否以很大的大小存储在堆栈上。仅仅因为它包含了很多元素并不会使它在堆栈上变得更大,它只是有一些可以忽略不计的簿记成员,只需将其保留在那里并使用
进行分配。您可以尝试
sizeof(vector)
sizeof(vector)
sizeof(vector)
并查看它们的大小是否相同。而且相当小。