在 C++ 中,要将向量的内容复制到另一个向量,我们使用赋值运算符dest = src。但是,在 Rustsrc中将被移入dest并且不再可用。
我知道最简单的答案是做dest = src.clone()(对于这个问题,我们会承担的缘故T中Vec<T>是Clone)。但是 - 如果我理解正确的话 - 这会创建一个全新的第三向量,其中复制了 的内容src并将其移动到 中dest,丢弃了dest动态分配的数组。如果这是正确的,当我们可以直接将内容复制到dest(假设它有足够的容量)时,这是完全不必要的动态分配。
下面是我制作的一个函数,它完全符合我的意愿:清空dest向量并将 的元素复制src到其中。
// copy contents of src to dest without just cloning src
fn copy_content<T: Clone>(dest: &mut Vec<T>, src: &Vec<T>) {
dest.clear();
if dest.capacity() < src.len() {
dest.reserve(src.len());
}
for x in src {
dest.push(x.clone());
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法使用内置或标准库实用程序来做到这一点?dest …
考虑std::atomic<int> x(0)。如果我理解正确,则std::memory_order_relaxed仅保证操作以原子方式发生,但不提供同步保证。因此x.fetch_add(1, std::memory_order_relaxed),来自 2 个线程的 1000 次将始终具有 2000 的最终结果。但是,这些调用中的任何一个的返回值都不能保证反映真实的当前值(例如,第 2000 次增量可能返回 1700 作为前一个值)。
但是 - 这就是我的困惑 - 鉴于这些增量是并行发生的,会x.load(std::memory_order_acquire)返回什么?或者x.fetch_add(1, std::memory_order_acq_rel)?这些是否返回真实的当前值,或者它们是否具有由于宽松的增量而导致的宽松排序所具有的过时答案的相同问题?
据我所知,该标准仅保证释放到获取(在同一变量上)同步并因此给出真实的当前值。那么如何轻松混合典型的获取-释放语义呢?
例如,我听说std::shared_ptr的引用计数以宽松的顺序递增并以 acq_rel 的顺序递减,因为它需要确保它具有真实值以便只删除一次对象。因此,我很想认为他们会给出真实的当前值,但我似乎找不到任何标准来支持它。