Function core::intrinsics::copy

1.0.0 (const: 1.63.0) · source ·
pub const unsafe fn copy<T>(src: *const T, dst: *mut T, count: usize)
Expand description

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

如果源和目标永远不会重叠,则可以改用 copy_nonoverlapping

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

副本是 “untyped”,因为数据可能未初始化或违反 T 的要求。初始化状态被完全保留。

Safety

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

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

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

  • srcdst 必须正确对齐。

read 一样,无论 T 是否为 Copycopy 都会创建 T 的按位副本。 如果 T 不是 Copy,则可以同时使用以 *src 开头的区域和以 * dst 开头的区域中的值。

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

Examples

从不安全的缓冲区有效地创建 Rust vector:

use std::ptr;

/// # Safety
/// * `ptr` 必须与其类型正确对齐且非零。
/// * `ptr` 必须对 `T` 类型的 `elts` 连续元素的读取有效。
/// * 除非 `T: Copy`,否则在调用此函数后不得使用这些元素。
unsafe fn from_buf_raw<T>(ptr: *const T, elts: usize) -> Vec<T> {
    let mut dst = Vec::with_capacity(elts);

    // SAFETY: 我们的前提条件是确保源文件对齐和有效,而 `Vec::with_capacity` 确保我们有可用的空间来编写它们。
    ptr::copy(ptr, dst.as_mut_ptr(), elts);

    // SAFETY: 我们之前已经用这么大的容量创建了它,而以前的 `copy` 已经初始化了这些元素。
    dst.set_len(elts);
    dst
}
Run