本文简要介绍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。 -
src
和dst
都必须正确对齐。
与 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 copy_nonoverlapping用法及代码示例
- Rust copy用法及代码示例
- Rust concat用法及代码示例
- Rust compile_error用法及代码示例
- Rust column用法及代码示例
- Rust compiler_fence用法及代码示例
- Rust concat_idents用法及代码示例
- Rust char.is_control用法及代码示例
- Rust char.is_alphanumeric用法及代码示例
- Rust char.len_utf16用法及代码示例
- Rust char.is_digit用法及代码示例
- Rust char.is_ascii_graphic用法及代码示例
- Rust char.decode_utf16用法及代码示例
- Rust char.is_uppercase用法及代码示例
- Rust catch_unwind用法及代码示例
- Rust char.to_ascii_lowercase用法及代码示例
- Rust char.is_ascii_uppercase用法及代码示例
- Rust canonicalize用法及代码示例
- Rust create_dir用法及代码示例
- Rust ctlz用法及代码示例
- Rust channel用法及代码示例
- Rust char.escape_unicode用法及代码示例
- Rust char.is_alphabetic用法及代码示例
- Rust char.is_ascii_control用法及代码示例
- Rust char.from_u32_unchecked用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Function std::ptr::copy。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。