100将字节切片复制到本地字节数组的最快方法是什么,该本地字节数组的大小可能与切片相同,也可能不同?

给定从函数返回的某个切片,其值为slice_: Box::<&[u8]>.我想将最大数量的切片数据复制到已知大小的本地数组buffer: [u8; slice_4] = [0; slice_4].换句话说,尽可能多地从slice_复制到buffer.slice_可以是任何长度.

fn main() {
    let slice_: Box::<&[u8]> = get_slice();
    let mut buffer: [u8; 1024] = [0; 1024];
    // copy slice_ to buffer ...
}

复制切片的最快方法是什么?复制切片最惯用的方法是什么?

我知道功能copy_from_slice.然而,这需要

src的长度必须与self相同.

我可以遍历slice_,但这似乎很笨拙.我猜还有一种更优雅的"乡村"方式.

推荐答案

此代码:

pub fn kopimi(buffer: &mut [u8; 1024], slice: &[u8]) {
    let n = std::cmp::min(buffer.len(), slice.len());
    buffer[0..n].copy_from_slice(&slice[0..n]);
}

assembles into four instructions进行优化:对memcpy进行比较、立即加载、条件移动和尾部调用:

example::kopimi:
        cmp     rdx, 1024
        mov     eax, 1024
        cmovae  rdx, rax
        jmp     qword ptr [rip + memcpy@GOTPCREL]

我认为你不可能比这更有效率了.

Rust相关问答推荐

有条件默认实现

borrow 和内部IntoIterator

何时可以在Rust中退出异步操作?

为什么`Vec i64`的和不知道是`Option i64`?

这个规则关于或模式到底是什么意思?如果表达片段的类型与p_i|q_i...&q;不一致,就会形成

如何导入crate-type=[";cdylib;]库?

如何循环遍历0..V.len()-1何时v可能为空?

更合理的方法来设计样条线函数器?

正在将带有盒的异步特征迁移到新的异步_fn_in_特征功能

如何将实现多个特征的 struct 传递给接受这些特征为&;mut?

如何从宏调用闭包?

从Rust 的临时文件中创建引用是什么意思?

如何使用 Rust Governor 为每 10 秒 10 个请求创建一个 RateLimiter?

Rust Redis 中的 HSET 命令问题

是否可以在 Rust 中的特定字符上实现特征?

判断对象是 PyDatetime 还是 Pydate 的实例?

如何在 Rust 中创建最后一个元素是可变长度数组的 struct ?

我如何将特征作为 struct 的拥有字段?

在 Rust 中返回对枚举变体的引用是个好主意吗?

类型参数不受 impl 特征、自身类型或谓词的约束