unique_ptr 是否交换复制内容?
Does unique_ptr swap copy contents?
我有一个带有多个成员变量的 class C,我正在编写一个二进制堆,其元素的类型为 std::unique_ptr。对于堆中元素的重新排序,我目前正在调用 std::swap(x,y) ,其中 x 和 y 是对 unique_ptr.
的引用
我对这个函数在 cplusplus.com 等网站上的解释有点困惑。
https://www.cplusplus.com/reference/memory/unique_ptr/swap-free/
https://www.cplusplus.com/reference/memory/unique_ptr/swap/
我的问题是:std::swap 的这些规范是否重新分配指针地址,或者它们确实在我每次调用 std::swap 时都对 x 和 y 中的内容进行了繁琐的复制?
我问是因为我还可以重新设计这个东西,让堆元素只是索引。这些索引指的是存储实际内容的向量条目。然后,堆中的交换将只交换两个 size_t(而不是 class C 的大元素)并且事情会起作用。
提前致谢。
std::swap(x, y)
交换变量 x
和 y
.
的内容
如果 x
和 y
是 unique_ptr
则它交换 unique_ptr
变量的内容。 unique_ptr
变量包含一个指针,而不是整个对象。由于指针已交换,现在 y
指向 x
曾经指向的地址,而 x
指向 y
曾经指向的地址。
换句话说,它等同于:
unique_ptr<whatever> temp = std::move(x);
x = std::move(y);
y = std::move(temp);
Do these specifications of std::swap reassign pointer addresses
是的。
or do they indeed do a tedious copy of the contents in x and y every time I call std::swap?
没有
如果你确实想执行这样的交换,你可以通过指针间接:
std::swap(*x, *y);
我有一个带有多个成员变量的 class C,我正在编写一个二进制堆,其元素的类型为 std::unique_ptr。对于堆中元素的重新排序,我目前正在调用 std::swap(x,y) ,其中 x 和 y 是对 unique_ptr.
的引用我对这个函数在 cplusplus.com 等网站上的解释有点困惑。
https://www.cplusplus.com/reference/memory/unique_ptr/swap-free/
https://www.cplusplus.com/reference/memory/unique_ptr/swap/
我的问题是:std::swap 的这些规范是否重新分配指针地址,或者它们确实在我每次调用 std::swap 时都对 x 和 y 中的内容进行了繁琐的复制?
我问是因为我还可以重新设计这个东西,让堆元素只是索引。这些索引指的是存储实际内容的向量条目。然后,堆中的交换将只交换两个 size_t(而不是 class C 的大元素)并且事情会起作用。
提前致谢。
std::swap(x, y)
交换变量 x
和 y
.
如果 x
和 y
是 unique_ptr
则它交换 unique_ptr
变量的内容。 unique_ptr
变量包含一个指针,而不是整个对象。由于指针已交换,现在 y
指向 x
曾经指向的地址,而 x
指向 y
曾经指向的地址。
换句话说,它等同于:
unique_ptr<whatever> temp = std::move(x);
x = std::move(y);
y = std::move(temp);
Do these specifications of std::swap reassign pointer addresses
是的。
or do they indeed do a tedious copy of the contents in x and y every time I call std::swap?
没有
如果你确实想执行这样的交换,你可以通过指针间接:
std::swap(*x, *y);