这就是我想到的,我想这应该和阅读一个条目的速度一样快。它遵循你最后一次进入的精神,但避免了蜕变(蜕变)
&mut T
到
*mut u8
可以通过两种类型来完成:
t as *mut T as *mut u8
).它还使用
MaybeUninit
而不是
zeroed
更明确一点(一旦优化,程序集可能是相同的)。最后,无论哪种方式,该函数都是不安全的,因此我们不妨将其标记为不安全函数,并删除该函数
unsafe
阻碍。
use std::io::{self, Read};
use std::slice::from_raw_parts_mut;
use std::mem::{MaybeUninit, size_of};
pub unsafe fn read_raw_struct<R: Read, T: Sized>(mut src: R) -> io::Result<T> {
let mut buffer = MaybeUninit::uninit();
let buffer_slice = from_raw_parts_mut(buffer.as_mut_ptr() as *mut u8, size_of::<T>());
src.read_exact(buffer_slice)?;
Ok(buffer.assume_init())
}