当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust copy用法及代码示例


本文简要介绍rust语言中 Function std::ptr::copy 的用法。

用法

pub unsafe fn copy<T>(src: *const T, dst: *mut T, count: usize)

count * size_of::<T>() 字节从 src 复制到 dst 。源和目标可能重叠。

如果源和目的地绝不重叠,std::ptr::copy_nonoverlapping可以用它代替。

copy 在语义上等同于 C 的 memmove ,但交换了参数顺序。复制就像将字节从 src 复制到临时数组,然后从数组复制到 dst 一样。

安全性

如果违反以下任何条件,则行为未定义:

  • 对于读取 count * size_of::<T>() 字节,src 必须是 valid

  • 对于 count * size_of::<T>() 字节的写入,dst 必须是 valid

  • srcdst 都必须正确对齐。

read 一样,copy 创建 T 的按位副本,无论 T 是否为 Copy 。如果 T 不是 Copy ,则使用从 *src 开始的区域和从 *dst 开始的区域中的值可以 violate memory safety

请注意,即使有效复制的大小 ( count * size_of::<T>() ) 是 0 ,指针也必须非空且正确对齐。

例子

从不安全的缓冲区高效地创建 Rust 向量:

use std::ptr;

/// # Safety
///
/// * `ptr` must be correctly aligned for its type and non-zero.
/// * `ptr` must be valid for reads of `elts` contiguous elements of type `T`.
/// * Those elements must not be used after calling this function unless `T: Copy`.
unsafe fn from_buf_raw<T>(ptr: *const T, elts: usize) -> Vec<T> {
    let mut dst = Vec::with_capacity(elts);

    // SAFETY: Our precondition ensures the source is aligned and valid,
    // and `Vec::with_capacity` ensures that we have usable space to write them.
    ptr::copy(ptr, dst.as_mut_ptr(), elts);

    // SAFETY: We created it with this much capacity earlier,
    // and the previous `copy` has initialized these elements.
    dst.set_len(elts);
    dst
}

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Function std::ptr::copy。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。