新任务的先前数据会发生什么变化?

时间:2017-01-31 05:09:35

标签: c++ c++11 memory vector types

考虑以下代码 -

{
    int n = 3;
    n = 5;

    std::vector<int> v = { 1, 2, 3 .... 3242};
    v = std::vector<int>{10000, 10001, 10002... 50000};
}

对于像int这样的原始数据类型,它可以简单地用新值覆盖以前的内存位置并远离它。但是,像std::vector这样的类型会发生什么,其中先前值的长度可能与新赋值的长度不同。

换句话说,当v被重新分配给新的{ 1, 2, 3 .... 3000}值时,部件{10000, 10001, 10002... 50000}会发生什么。它是否只是丢弃了之前的值并将内部指针重新分配给新位置?或者它是否尽可能多地使用新数据覆盖以前的位置,并在大量分配的情况下重新分配新内存,或者在分配较短的情况下清除现有内存,从而保留初始向量的capacity()? p>

除了清除内容(v=vector<int>{} vs .clear())之外,

1 个答案:

答案 0 :(得分:3)

  

然而,像std :: vector这样的类型会发生什么,其中先前值的大小可能与新赋值不同。

我认为你的意思是新数据数组的长度可能不同?

std::vector将内部存储的关注点与正在使用的存储空间分开。如果新数据具有更少,相同或更多元素,则对象通常会重复使用相同的存储。它比简单地被覆盖更复杂,因为旧对象需要调用它们的析构函数(如果它们不是PODS),但实质上是,是的。它们被覆盖(安全)。

如果你看一下std::vector的源代码,你会看到很多相当复杂的代码,涵盖了你提到的所有案例,还有一些你没有提到的案例。

编写一个异常安全,最佳效率的向量并非易事。

除非您对实施感兴趣(因为您想要改进它,维护它或者只是好奇),std::vector行为的文档足以说明您对它的期望。< / p>

特别注意哪些操作会导致迭代器失效。这是一个有用的提示,内部对象要么在存储中移动,要么可以分配新存储。

link:http://en.cppreference.com/w/cpp/container/vector