一、栈
声明变量即可
fn main() {
let a = A;
}
二、堆
1.智能指针
一般先在栈上创建对象,再移动到堆,如果是大对象
会先栈溢出
fn main() {
// 1MB overflowed its stack
let a = [0u8; 2usize.pow(20)];
let box_a = Box::new(a);
}
但在new里面创建不会报错
fn main() {
// 1MB
let box_a = Box::new([0u8; 2usize.pow(20)]);
}
跟编译器有关,参考视频: Box::new会发生拷贝吗
2.分配器
先创建布局,再申请内存。偏底层,不会在栈上分配空间,但是空间过大还是会申请失败返回空指针
fn main() {
let layout = Layout::array::<u8>(2usize.pow(20)).unwrap();
unsafe {
let p = alloc(layout) as *mut u64;
println!("{}", p.is_null());
}
}