C++ 使用指针指向指针向量有什么好处吗?
C++ Any benifits using pointer to vector of pointers?
在我开始之前,我已经看过这些问题:
指向指针向量的指针的内存消耗
指向矢量的指针与指向指针的矢量 vs 指向指针的矢量的指针
他们都没有回答我的问题。
我正在从事一个涉及数百万个实例的项目。
我使用的数据结构第一次看有点复杂,结构本身对这个问题并不重要。
现在,如果我有以下内容:
vector<object*> *myVector;
一切都进入了堆。
但是,如果我使用它会发生什么:
vector<object*> myVector;
向量本身是否存储在堆栈上?然后它的内容存储在堆上?例如,如果向量有 1000 万个实例,我是否会在堆栈上有 1000 万个引用,用于堆上的 1000 万个对象?还是我错过了什么?
此外,如果我使用这个:
vector<object> *myVector;
矢量的内容去哪儿了?一切都在堆上吗?如果是,那么它是否递归工作?例如:
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 类型或包含可变数据量的任何类型都将在堆上动态分配其数据。
现在有一些特殊情况,例如自定义分配器、奇怪的优化、术语的细节,但出于实际目的,这是您应该知道的。
您可能想要了解的下一件事是智能指针,例如std::unique_ptr
和std::shared_ptr
,所有权语义和RAII。为了编写正确的代码,了解这一点实际上更为重要(我需要删除和担心什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用基类指针调用基类的值构造函数的语法是什么?
- 将指针分配给另一个指针时会发生什么情况?
- 当该数组的索引中没有元素时,指针指向什么?
- C++:Lambda 函数指针转换的用例是什么?
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 如果我在 const 函数上使用指针,我可以返回什么?
- 为什么此指针值不能转换为整数的规则是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 以下与指针相关的代码的输出是什么?
- 指向数组基址的指针而不是指向第一个元素的指针有什么优点?
- C++中的指针.什么类型的对象