当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust copy_nonoverlapping用法及代码示例


本文简要介绍rust语言中 Function std::ptr::copy_nonoverlapping 的用法。

用法

pub unsafe fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize)

副本count * size_of::<T>()字节来自srcdst。源和目的地必须不是重叠。

对于可能重叠的内存区域,请改用 copy

copy_nonoverlapping 在语义上等同于 C 的 memcpy ,但交换了参数顺序。

安全性

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

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

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

  • srcdst 都必须正确对齐。

  • 内存区域开始于src大小为count * size_of::<T>()字节必须不是与开始于的内存区域重叠dst具有相同的尺寸。

就像std::ptr::read,copy_nonoverlapping创建一个按位复制T, 不管是否Tstd::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-lang.org大神的英文原创作品 Function std::ptr::copy_nonoverlapping。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。