当我推动更多元素而不是Vec的容量时,为什么没有错误?

Ash*_*123 2 rust

我遇到了这个潜在的错误:

#[derive(Debug)]
enum StackType {
    Int(i64),
    Float(f64),
    Word(String),
}

fn main() {
    let mut stack: Vec<StackType> = Vec::with_capacity(1);
    stack.push(StackType::Int(5));
    stack.push(StackType::Float(5_f64));
    stack.push(StackType::Word(String::from("ABC")));
    println!("{:?}", stack);
}
Run Code Online (Sandbox Code Playgroud)

我在Windows 10上使用Rust v1.26.0(a77568041 2018-05-07).

当我编译并运行上面的程序时,我预计会出现错误,因为指定的容量为1并且我使用了push 3次,但输出正确:

[Int(5), Float(5.0), Word("ABC")]
Run Code Online (Sandbox Code Playgroud)

Jor*_*eña 7

Vec它可以动态增长,类似于C++ std::vector.您指定的事实with_capacity只是意味着它可以容纳那么多元素而无需重新分配.请参阅以下文档Vec::with_capacity:

构造一个Vec<T>具有指定容量的new,empty .

矢量将能够准确保存capacity元素而无需重新分配.如果capacity为0,则向量将不会分配.

值得注意的是,尽管返回的向量具有指定的容量,但向量的长度为零.有关长度和容量之间差异的说明,请参阅容量和重新分配.

以下是Vec有关容量和重新分配的文档的摘录:

向量的容量是为将要添加到向量上的任何未来元素分配的空间量.这不应与向量的长度混淆,向量的长度指定向量中的实际元素的数量.如果向量的长度超过其容量,则其容量将自动增加,但其元素必须重新分配.

例如,容量为10且长度为0的向量将是一个空向量,其中包含10个元素的空间.将10个或更少的元素推入向量不会改变其容量或导致重新分配.但是,如果向量的长度增加到11,则必须重新分配,这可能很慢.因此,建议尽可能使用Vec::with_capacity指定矢量的大小.

这与固定长度的阵列不同,后者可能不超过指定的长度.