ownership
2020-04-09 本文已影响0人
allenhaozi
堆和栈是代码在运行时, 可供使用的内存, 但是他们的结构不同
无效的引用
let s1 = String::from("hello");
let s2 = s1;
println!("{}, world!", s1);
有效的引用
let x = 5;
let y = x;
println!("x = {}, y = {}", x, y);
原因是像整型这样的在编译时已知大小的类型被整个存储在栈上,所以拷贝其实际的值是快 速的。这意味着没有理由在创建变量 y 后使 x 无效
栈
- 后进先出
- 所有数据必须占用已知且固定的大小
堆
编译时大小未知或者大小可变的数据存储在堆上
- 堆是缺乏组织的
- 向堆存放数据时, 请求一定大小的空间, 操作系统在堆上找到一块足够大的空位
标记为已使用, 返回一个表示该位置的地址指针
Rust ownership
- Rust中每个值都有一个被称为其所有者的(owner)的变量
- 值有且只有一个所有者
- 当所有者(变量)离开作用域, 这个值被丢弃
# 成功的例子
let a = "allen";
let b = a;
print!("you input is : {}\n",b);
# 失败的例子
let s1 = String::from("hello");
let s2 = s1;
println!("{}, world!", s1);
上面这个示例会报错, 因为rust为了确保内存安全, 与其尝试拷贝被分配的内存, rust认为s1不在有效,
string-storage
左边是栈上的, 右边是堆上的