【发布时间】:2019-06-05 16:11:47
【问题描述】:
clone_from 的文档说:
从源执行复制分配。
a.clone_from(&b)在功能上等同于a = b.clone(),但可以被覆盖以重用 a 的资源以避免不必要的分配。
为什么clone_from(复制分配)避免不必要的分配?有什么例子?
我认为这是 C++ 中众所周知的概念,但我没有深厚的 C++ 背景。
【问题讨论】:
标签: rust
clone_from 的文档说:
从源执行复制分配。
a.clone_from(&b)在功能上等同于a = b.clone(),但可以被覆盖以重用 a 的资源以避免不必要的分配。
为什么clone_from(复制分配)避免不必要的分配?有什么例子?
我认为这是 C++ 中众所周知的概念,但我没有深厚的 C++ 背景。
【问题讨论】:
标签: rust
我们以两个向量 a 和 b 为例。每个向量必须分配一个内部缓冲区来存储元素。
以下是每种情况发生的情况:
a = b.clone() 总是执行b.clone(),它创建一个带有自己缓冲区的全新向量,然后a = brand_new_vector 丢弃a 的缓冲区并从brand_new_vector 窃取一个。a.clone_from(&b):如果a的缓冲区太小,它会分配足够大的缓冲区,但如果a的缓冲区已经足够大,它会将b中的每个元素直接复制到a的缓冲区。在后一种情况下,a 的缓冲区被回收并避免了内存分配。【讨论】:
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 的元素被克隆。如果破坏和克隆都有副作用,那么可以观察到差异。