【问题标题】:Why does creating a very large vector of zero sized items take forever while an array is fine?为什么创建一个非常大的零大小项目向量需要永远,而数组很好?
【发布时间】:2020-03-05 08:10:08
【问题描述】:

这段代码运行良好:

use std::mem::size_of;

fn main() {
    println!("{}", size_of::<[(); usize::max_value()]>());
    let x = [(); usize::max_value()];
    println!("done");
}

它会立即打印出0done。数组毕竟是 0 字节大,所以这是意料之中的。

但是,如果我使用 Vec,情况会有所不同:

fn main() {
    let x = vec![(); usize::max_value()];
    println!("done");
}

这会运行很长时间并且从不打印done为什么会这样?我还希望向量的实际大小为 0。所以它不应该需要分配或写入任何内存。什么需要这么长时间?

这只发生在我编译时没有优化。通过优化,它立即完成。

【问题讨论】:

    标签: rust


    【解决方案1】:

    您的数组表达式[(); usize::max_value()] 被编译器直接理解和解释。另一方面,vec![(); usize::max_value()] 表达式是一个宏。那么让我们看看它扩展成什么!

    使用cargo expand,我得到:

    let x = ::alloc::vec::from_elem((), usize::max_value());
    

    您不会在文档中找到此方法,因为它是 doc(hidden)。你可以看到它in the source here。它委托一个特征来专门针对某些类型的性能。在() 的情况下,使用this impl。这里主要调用私有方法extend_withdefined here

    我们终于看到了问题:for _ in 1..n 循环。如果没有优化,则不会删除此循环,因此,程序将永远尝试执行 usize::max_value() 循环迭代。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      相关资源
      最近更新 更多