我正在初始化buf
在立即用以下内容重写其内容之前不必要地全为零read_exact
:
fn parse<R: Read>(r: &mut R) -> Result<()> {
let mut buf = [0u8; 1024];
r.read_exact(&mut buf)?;
// Do things to buf
Ok(true)
}
虽然我不认为0初始化很耗时,但似乎没有必要。有没有解决的办法?
是的,安全 Rust 中需要这样的初始化。编译器不一定能够知道组合 of read_exact
and ?
将阻止访问数组中任何未初始化的数据。优化过程可能会使其变得更好,但不能指望它起作用。
你可以改为读入Vec
,它在内部保证永远不允许访问未初始化的内存:
fn parse<R: Read>(r: &mut R) -> io::Result<()> {
let mut buf = vec![]; // Can optionally use `Vec::with_capacity`
r.take(1024).read_to_end(&mut buf)?;
// Do things to buf
Ok(())
}
在不安全的 Rust 中,你可以使用mem::uninitialized
。在选择这种情况之前,请确保您了解所涉及的所有可怕的细微差别!读取未初始化的内存是 Rust 中未定义的行为,所以you必须绝对确保防止这种情况发生。
在这里,我们依靠:
- 事实是
read_exact
如果未填充所有字节,将返回错误。
- 事实是析构函数 of
[u8; 1024]
不会读取字节。这是发生错误或引发恐慌时需要考虑的重要途径。
fn parse<R: Read>(r: &mut R) -> io::Result<()> {
unsafe {
let mut buf: [u8; 1024] = mem::uninitialized();
r.read_exact(&mut buf)?;
// Do things to buf
}
Ok(())
}
如果没有大量的分析,我认为这是不值得的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)