C++ 使用指向指针向量的指针有什么好处?
C++ Any benifits using pointer to vector of pointers?
开始之前,我已经看过这些问题了:
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;
向量本身是否存储在堆栈中?然后它的内容存储在堆上?例如,如果 vector 有 1000 万个实例,那么对于堆上的 1000 万个对象,我会在堆栈上有 1000 万个引用吗?还是我遗漏了什么?
此外,如果我使用这个:
vector<object> *myVector;
vector 的内容去哪里了?一切都在堆上吗?如果是,那么它是否递归工作?例如:
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::unique_ptr
和 std::shared_ptr
,所有权语义和 RAII。为了编写正确的代码,了解这一点实际上更为重要(我需要删除和担心什么?)。
开始之前,我已经看过这些问题了:
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;
向量本身是否存储在堆栈中?然后它的内容存储在堆上?例如,如果 vector 有 1000 万个实例,那么对于堆上的 1000 万个对象,我会在堆栈上有 1000 万个引用吗?还是我遗漏了什么?
此外,如果我使用这个:
vector<object> *myVector;
vector 的内容去哪里了?一切都在堆上吗?如果是,那么它是否递归工作?例如:
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::unique_ptr
和 std::shared_ptr
,所有权语义和 RAII。为了编写正确的代码,了解这一点实际上更为重要(我需要删除和担心什么?)。