锈向量是否连续分配?
Is rust vector continuously allocated?
我是 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
地址附近的某个地方。
是 Vec
将其数据存储在连续的内存部分。 &vector
为您提供对位于堆栈上的实际 Vec
结构的引用,其中包含容量、指针和长度。相反,如果你打印 vector.as_ptr()
那么你应该得到一个更有意义的结果。此外,您应该在循环打印之前推送,因为理论上对 push
的调用可能会在最后一次迭代中 re-allocate 然后您的指针看起来会有所不同。
我是 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
地址附近的某个地方。
是 Vec
将其数据存储在连续的内存部分。 &vector
为您提供对位于堆栈上的实际 Vec
结构的引用,其中包含容量、指针和长度。相反,如果你打印 vector.as_ptr()
那么你应该得到一个更有意义的结果。此外,您应该在循环打印之前推送,因为理论上对 push
的调用可能会在最后一次迭代中 re-allocate 然后您的指针看起来会有所不同。