使用赋值运算符时分配免费 std::vector 副本

Allocation free std::vector copy when using assignment operator

std::vector 的两个实例具有原始数据类型,具有相同的大小和容量时,是否可以保证通过复制赋值运算符进行复制不会重新分配目标向量?

示例:

const int n = 3;

std::vector<int> a, b;

// ensure defined capacity
a.reserve(n);
b.reserve(n);

// make same size
a.resize(n);
b.resize(n);

// set some values for a
for (int i = 0; i < n; i++)
{
    a[i] = i;
}

// copy a to b: allocation free?
b = a;

我只发现“否则,*this 拥有的内存可能会在可能的情况下被重用。” (C++11 起) cppreference.com。我希望是“必须”而不是“可能”。

如果对于更一般的情况(例如“相同大小就足够”)应该有肯定的答案,那就更好了。

如果不能保证,这种情况可以作为 Copying std::vector: prefer assignment or std::copy? 的答案,而 std::copy 是首选。

标准不保证不会有分配。根据 C++11 Standard the effect of b = a; is as if b.assign(a.begin(), a.end()) (with surplus b's elements destroyed, if any) which result is "Replaces elements in b with a copy of [a.begin(), a.end())". Nothing about allocations but with the C++20 Standard(可能更早)我们有一个额外的声明:“使引用 b 的元素的所有引用、指针和迭代器无效”。这意味着分配是可能的,并且这些保证中的任何地方都没有提到 capacity() 以防止在您的特定情况下发生这种情况。

另一方面,在实践中,如果已经有足够的内存,为什么还要重新分配内存?