【发布时间】:2021-12-03 21:31:45
【问题描述】:
我有一个阅读器,其中包含有关 51*51 网格的信息,其中网格上的每个点都由 f32 表示。我想将这些数据读入一个向量,以便我可以轻松处理它:
pub fn from_reader<R: Read + Seek>(reader: &mut R) -> Arena {
let arena_size = 51 * 51;
let arena_byte_size = arena_size * size_of::<f32>();
let mut arena = vec![0.0f32; arena_size];
unsafe {
let mut arena_slice =
std::slice::from_raw_parts_mut(arena.as_mut_ptr() as *mut u8, arena_byte_size);
let _ = reader.read(&mut arena_slice);
};
//...
}
此方法不方便且不必要地缓慢,因为它强制将向量的所有元素初始化为 0 值。我最初想简单地分配一个缓冲区,而不是初始化它,将数据读入其中,然后使用from_raw_parts 从中创建一个向量。但是我被告知这是未定义的行为,因为出于某种深不可测的原因,read 和 read_exact 要求调用者在调用它们之前初始化传递给它们的数据。
为什么会这样?有什么解决方法吗? Rust 团队是否正在制定任何解决方案?
【问题讨论】:
标签: rust