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。 -
src
和dst
必须正确对齐。
与 read
一样,无论 T
是否为 Copy
,copy
都会创建 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