Rust编程基础:00八、全部权

一、Rust经过全部权机制来管理内存,编译器在编译就会根据全部权规则对内存的使用进行检查。
二、堆和栈。编译的时候数据的类型大小是固定的,就是分配在栈上的。编译的时候数据类型大小不固定,就是分配在堆上的。git

let x: i32 = 1; // x被分配在栈上
let s1 = String::from("hello"); // s1被分配在堆上
s1.push_str(" world");
println!("s1 = {}", s1);

三、做用域:{}github

let x: i32 = 1;
{
    let y: i32 = 1;
    println!("x = {}", x);
}
println!("y = {}", y); // 错误!在y的做用域以外使用y

四、String内存回收。String类型在离开做用域的时候会调用drop方法。
五、move移动。函数

let s1 = String::from("hello");
let s2 = s1; // move语义
println("s2 = {}", s2);
println("s1 = {}", s1); // 错误!s1被借用

六、clone克隆。url

let s1 = String::from("hello");
let s2 = s1.clone(); // clone语义
println("s2 = {}", s2);
println("s1 = {}", s1); // 没有问题!s1被克隆

七、栈上数据拷贝。经常使用的具备copy trait特征的有:全部的整型、浮点型、布尔型、字符类型、元组等。.net

let a = 1;
let b = a; // copy语义
println!("a = {}, b = {}", a, b); // 没有问题!栈上的变量被拷贝

八、函数和做用域。code

fn takes_ownership(some_string: String) -> String {
    println!("{}", some_string);
    some_string
}

fn makes_copy(i: i32) {
    println!("i = {}", i);
}

fn main() {
    let s = String::from("hello");
    let s1 = takes_ownership(s); // move语义
    println!("{}", s); // 错误!s已经被借用
    println!("{}", s1);

    let x = 5;
    makes_copy(x); // copy语义
    println!("{}", x); // 没有问题!x具备copy特征
}


本节的完整源代码:
https://github.com/anonymousGiga/learn_rust/blob/master/learn_own/src/main.rs
https://github.com/anonymousGiga/learn_rust/blob/master/learn_fn2/src/main.rsip

相关文章
相关标签/搜索