【问题标题】:Does unique_ptr swap copy contents?unique_ptr 是否交换副本内容?
【发布时间】:2021-03-16 09:08:24
【问题描述】:

我有一个包含多个成员变量的 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(而不是 C 类的大元素)并且事情会起作用。

提前谢谢你。

【问题讨论】:

  • 需要注意的一点:不是 cplusplus 的忠实粉丝。 cppreference 通常要好得多。
  • 您有指向您的unique_ptr 的指针吗?如果它是基于索引的,你应该没问题。
  • 我没有指向 unique_ptr 的指针。他们正在被交换,因为我需要在堆中保持一定的顺序。因此,例如,当我将一个元素添加到堆中时,它必须插入到堆中的正确位置。这是通过成对交换元素来完成的,直到新元素到达其正确位置。
  • 如果这些指针是真正“独特的”,因为您不会将它们复制到所有地方,那么是的,swap 应该做您想做的事。它为您完成复制。它所做的只是交换两个任意事物的内容。
  • 使用std::swap() 和两个std::unique_ptrs 调用std::unique_ptr::swap(),交换指针和关联的删除器(std::unique_ptr 的另一个成员处理销毁托管对象)。它不会破坏和重建任何托管对象。

标签: c++ swap unique-ptr


【解决方案1】:

std::swap(x, y) 交换变量xy 的内容。

如果xyunique_ptrs,那么它交换unique_ptr 变量的内容。 unique_ptr 变量包含一个指针,而不是整个对象。由于指针被交换,现在y指向x曾经指向的地址,x指向y曾经指向的地址。

换句话说就是:

unique_ptr<whatever> temp = std::move(x);
x = std::move(y);
y = std::move(temp);

【讨论】:

  • 所以只是为了确保我做对了。最重要的是,交换确实只是交换地址,因此,开箱即用的操作比复制我的 C 类元素或您的“任何”事物的繁琐副本更有效。
  • 它根本不复制whatever 对象,它复制whatever*只是 指针,以及unique_ptr 具有的任何其他特定于实现的crud。
  • 如果您的调试器允许,请查看unique_ptr 中的实际内容。通常不会太多。这就是所有被“感动”的东西。在许多情况下,它实际上只是一个指针。
【解决方案2】:

这些规范的 std::swap 是否重新分配指针地址

是的。

还是每次我调用 std::swap 时,他们确实都会对 x 和 y 中的内容进行繁琐的复制?

没有。

如果你确实想执行这样的交换,你可以通过指针间接:

std::swap(*x, *y);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多