Function std::intrinsics::copy 1.0.0[−][src]
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
一样进行复制。
Safety
如果违反以下任一条件,则行为是未定义的:
-
src
对于count * size_of::<T>()
字节的读取,必须是 有效 的。 -
dst
对于count * size_of::<T>()
字节的写入,必须为 有效 的。 -
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