rust - rust 向量是否连续分配?

我是 Rust 的新手,我正在研究向量实现。我尝试多次调整向量的大小并使用以下代码检查元素的地址:

fn main() {
    let mut vector = Vec::new();

    for i in 1..100 {
        println!(
            "Capacity:{}, len: {}, addr: {:p}",
            vector.capacity(),
            vector.len(),
            &vector,
        );
        vector.push(i);
    }
    println!("{:p}", &vector[90]);
}

它给了我输出(最后两行):

Capacity:128, len: 98, addr: 0x7ffebe7a6930
addr of 90-element: 0x5608b516bd08

我的问题是为什么第 90 个元素在另一个内存位置?我认为它应该在 0x7ffebe7a6930 地址附近的某个地方。

回答1

Vec stores 其数据在内存的连续部分中。 &vector 为您提供了对存在于堆栈中的实际 Vec 结构的引用,该结构包含容量、指针和长度。相反,如果您打印 vector.as_ptr() 那么您应该得到更有意义的结果。此外,您可能应该在循环打印之前推送,因为理论上对 push 的调用可能会在最后一次迭代中重新分配,然后您的指针看起来会有所不同。