本文简要介绍rust语言中 Function std::intrinsics::copy_nonoverlapping
的用法。
用法
pub unsafe fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize)
副本count * size_of::<T>()
字节来自src
到dst
。源和目的地必须不是重叠。
对于可能重叠的内存区域,请改用 copy
。
copy_nonoverlapping
在语义上等同于 C 的 memcpy
,但交换了参数顺序。
安全性
如果违反以下任何条件,则行为未定义:
-
对于读取
count * size_of::<T>()
字节,src
必须是 valid。 -
对于
count * size_of::<T>()
字节的写入,dst
必须是 valid。 -
src
和dst
都必须正确对齐。 -
内存区域开始于
src
大小为count * size_of::<T>()
字节必须不是与开始于的内存区域重叠dst
具有相同的尺寸。
就像std::ptr::read,copy_nonoverlapping
创建一个按位复制T
, 不管是否T
是std::marker::Copy.如果T
不是std::marker::Copy, 使用两个都该区域中的值始于*src
和区域开始于*dst
能够违反内存安全.
请注意,即使有效复制的大小 ( count * size_of::<T>()
) 是 0
,指针也必须非空且正确对齐。
例子
手动实现 Vec::append
:
use std::ptr;
/// Moves all the elements of `src` into `dst`, leaving `src` empty.
fn append<T>(dst: &mut Vec<T>, src: &mut Vec<T>) {
let src_len = src.len();
let dst_len = dst.len();
// Ensure that `dst` has enough capacity to hold all of `src`.
dst.reserve(src_len);
unsafe {
// The call to offset is always safe because `Vec` will never
// allocate more than `isize::MAX` bytes.
let dst_ptr = dst.as_mut_ptr().offset(dst_len as isize);
let src_ptr = src.as_ptr();
// Truncate `src` without dropping its contents. We do this first,
// to avoid problems in case something further down panics.
src.set_len(0);
// The two regions cannot overlap because mutable references do
// not alias, and two different vectors cannot own the same
// memory.
ptr::copy_nonoverlapping(src_ptr, dst_ptr, src_len);
// Notify `dst` that it now holds the contents of `src`.
dst.set_len(dst_len + src_len);
}
}
let mut a = vec!['r'];
let mut b = vec!['u', 's', 't'];
append(&mut a, &mut b);
assert_eq!(a, &['r', 'u', 's', 't']);
assert!(b.is_empty());
相关用法
- 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 char.is_ascii_alphabetic用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Function std::intrinsics::copy_nonoverlapping。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。