使用赋值运算符时分配免费 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()
以防止在您的特定情况下发生这种情况。
另一方面,在实践中,如果已经有足够的内存,为什么还要重新分配内存?
当 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()
以防止在您的特定情况下发生这种情况。
另一方面,在实践中,如果已经有足够的内存,为什么还要重新分配内存?