【问题标题】:How can Clone::clone_from avoid unnecessary allocations?Clone::clone_from 如何避免不必要的分配?
【发布时间】:2019-06-05 16:11:47
【问题描述】:

clone_from 的文档说:

从源执行复制分配。

a.clone_from(&b) 在功能上等同于a = b.clone(),但可以被覆盖以重用 a 的资源以避免不必要的分配。

为什么clone_from(复制分配)避免不必要的分配?有什么例子?

我认为这是 C++ 中众所周知的概念,但我没有深厚的 C++ 背景。

【问题讨论】:

    标签: rust


    【解决方案1】:

    我们以两个向量 ab 为例。每个向量必须分配一个内部缓冲区来存储元素。

    以下是每种情况发生的情况:

    • a = b.clone() 总是执行b.clone(),它创建一个带有自己缓冲区的全新向量,然后a = brand_new_vector 丢弃a 的缓冲区并从brand_new_vector 窃取一个。
    • a.clone_from(&b):如果a的缓冲区太小,它会分配足够大的缓冲区,但如果a的缓冲区已经足够大,它会将b中的每个元素直接复制到a的缓冲区。在后一种情况下,a 的缓冲区被回收并避免了内存分配。

    【讨论】:

    • Rust 会自动将a = b.clone() 转换为a.clone_from(&b) 吗?如果不是,是什么阻止它这样做?
    • 不,因为Clone 就编译器而言并不是一个特殊的特征,所以编译器不知道a.clone_from(&b) 在语义上等同于a = b.clone()
    • 我实际上会说它不等效。在a = b.clone() 中,b 的元素被克隆,然后a 的元素被破坏。在a.clone_from(&b) 中,a 的元素被破坏,然后b 的元素被克隆。如果破坏和克隆都有副作用,那么可以观察到差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多