gpt4 book ai didi

c++ - 嵌套 C++ vector 的重新分配

转载 作者:行者123 更新时间:2023-11-30 03:59:35 25 4
gpt4 key购买 nike

假设我们有一个包含 std::vector 容器的结构:

struct A {
char a; // decoration
vector<int> v;

A() {}
};

在我们代码的某个点,我们有一个 std::vector 存储那些 A 结构(这意味着,两层 std::vectors),之后,我们在其中一个元素上为 v 保留更多的内存空间:

    /*...*/
vector<A> vect;
vect.resize(10, A());
vector<A>* vect_ptr = &vect;
vect[0].v.reserve(9999999);
cout << vect_ptr << " ?= " << &vect << endl;
/*...*/

问题是:在为“低级” vector v 之一保留空间后,是否存在“高级” vector vect被重新分配,使指针 vect_ptr 无效?

在肯定的情况下,将 v 重新定义为解决方案的引用吗? (即使它添加了一个间接级别):

struct A {
char a;
vector<int>& v;

A() : v(vector<int>()) {}
};

最佳答案

没有。不存在这种风险。

vect 拥有一些内存,它在其中写入了一堆 A:所以在内存中可能是这样的:

[--A--][--A--][--A--]...[--A--]
^ ^
&vect[0] &vect[9]

但是每个 A 都有一些指向其他地方更多内存的 vector 。以下是 vect[1].v 可能指向的内容的粗略说明:

         [int][int][int][int][int]...
^
|
[--A--][--A--][--A--]...[--A--]
^ ^
&vect[0] &vect[9]

(我为可怕的 ascii 艺术道歉)

这两个容器拥有自己的不重叠的内存。调整其中一个“内部” vector 的大小可能会改变它拥有的内存,但它与 vect 拥有的内存无关(除非你的分配器严重损坏,std::allocator 不是)。您可以将 vect 的内存视为完全禁止其他任何尝试分配的内存。您尝试在其中一个“内部” vector 中分配多少并不重要。在某些时候,您将无法分配那么多内存,但永远不会有重新分配任何其他对象的风险。

关于c++ - 嵌套 C++ vector 的重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26854254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com