昨天看到rust中文社区的分析胖指针的内存局部的文章( String是胖指针吗? ).
如果只看String结构体的话,看源码也行,不过实际验证一下也不错.
这次分析Vec<isize>
直接上代码哦
#[repr(C)]
#[derive(Debug)]
struct VS{
ptr:u64,
a:u64,
b:u64,
}
fn stack(pa: usize){
let a = 10;
let mut v = Vec::with_capacity(4);
v.push(10);
println!("stack fn pa{:p},a{:p},vec:{:p}",&pa,&a, &v);
println!("stack vec len {},cap {}; buf address of vec:{:p}", v.len(),v.capacity(),v.as_ptr());
let c:VS = unsafe{std::mem::transmute(v)};
println!("struct of {:?}, buf address of vec{:x}",c,c.ptr);
println!("---end---");
}
fn main() {
stack(1);
stack(2);
}
运行截图如下;
本来是准备拿指针强转ptr然后加偏移量的,但是rust有点麻烦就转成另一个结构体了.
vec的内存布局是<ptr,cap,len>
在栈上, buf在堆上.
其实这样子有些武断,但是俺不会调试汇编😅.但是内存布局是清楚的了.