我想将一个单独拥有的数组分成两个拥有的半部分——即两个独立的数组,而不是原始数组的切片。它们的大小是编译时常量。是否有一种方法可以做到这一点,而不必复制或克隆元素?
let array: [u8; 4] = [0, 1, 2, 3];
let chunk_0: [u8; 2] = ???;
let chunk_1: [u8; 2] = ???;
assert_eq!(
[0, 1],
chunk_0
);
assert_eq!(
[2, 3],
chunk_1
);
由于这只会涉及到元素所有权的移动,我有一种预感,应该存在零成本抽象来实现此操作。我想知道是否可以通过巧妙使用 transmute
和 forget
来实现此操作。但是文档中对这些函数有很多可怕的警告。
我的主要动机是在内存中处理大型数组时减少内存复制的次数。例如:
let raw = [0u8; 1024 * 1024];
let a = u128::from_be_array(???); // Take the first 16 bytes
let b = u64::from_le_array(???); // Take the next 8 bytes
let c = ...
我所知道的实现上述模式的唯一方法是大量的内存复制,这是多余的。
.split_at
?Playground 示例 - HerohtarReadBytesExt
的东西,它来自于byteorder
包。它基本上会做你想要避免的事情,但这确实是你想要的,并且它可以进行优化。我应该指出,如果您有一个字节数组并且想要一个u128
,那么这16个字节将在某个时候被复制。 - kmdreko