gpt4 book ai didi

arrays - 如果我将文件内容读入数组,是否需要初始化数组?

转载 作者:行者123 更新时间:2023-11-29 07:52:15 26 4
gpt4 key购买 nike

在立即用 read_exact 覆盖它的内容之前,我用全零不必要地初始化了 buf:

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 中需要这样的初始化。编译器不一定能够判断 read_exact ?组合 将阻止对任何未初始化的访问来自数组的数据。优化过程可能会使它变得更好,但不能指望它起作用。

您可以改为读入 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 中的未定义行为,因此必须绝对确保您防止它发生。

在这里,我们依靠:

  1. 如果 read_exact 没有填充所有字节,它会返回一个错误。
  2. [u8; 的析构函数; 1024] 不会读取字节。这是发生错误或引发 panic 时要考虑的重要途径。
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(())
}

如果不进行大量分析,我认为这是不值得的。

关于arrays - 如果我将文件内容读入数组,是否需要初始化数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47502831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com