将字节切片复制到大小不匹配的数组中

Jam*_*979 3 rust

tl;dr将字节切片复制到本地字节数组(其大小可能与切片大小相同或不同)的最快方法是什么?

给定从函数返回的一些切片作为slice_: &[u8]. 我想将最大数量的切片数据复制到已知大小的本地数组buffer: [u8; 1024] = [0; 1024]. 换句话说,尽可能多地复制 fromslice_buffer。可以slice_是任意长度。

fn main() {
    let slice_: &[u8] = get_slice();
    let mut buffer: [u8; 1024] = [0; 1024];
    // copy slice_ to buffer ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

的长度src必须与 相同self

我可以迭代,slice_但这看起来很笨拙。我猜想还有一种更优雅的“质朴”方式。

use*_*170 5

这段代码:

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

优化汇编为四个指令:比较、立即加载、条件移动和尾部调用memcpy

\n
example::kopimi:\n        cmp     rdx, 1024\n        mov     eax, 1024\n        cmovae  rdx, rax\n        jmp     qword ptr [rip + memcpy@GOTPCREL]\n
Run Code Online (Sandbox Code Playgroud)\n

我不认为\xe2\x80\x99 可以得到比这更高的效率。

\n