网站后台密码修改,望野原文翻译,wordpress中文标题字体,网站开发高级工程师专业文章目录 所有权引用和借用可变引用悬垂引用 所有权
Rust通过所有权来管理内存#xff0c;最妙的是#xff0c;这种检查只发生在编译期#xff0c;因此对于程序运行期#xff0c;不会有任何性能上的损失。 使用堆和栈的性能区别#xff1a; 写入方面#xff1a;入栈比在… 文章目录 所有权引用和借用可变引用悬垂引用 所有权
Rust通过所有权来管理内存最妙的是这种检查只发生在编译期因此对于程序运行期不会有任何性能上的损失。 使用堆和栈的性能区别 写入方面入栈比在堆上分配内存要快。 因为入栈时操作系统无需分配新的空间只需要将新数据放入栈顶即可。相比之下在堆上分配内存则需要更多的工作这是因为操作系统必须首先找到一块足够存放数据的内存空间接着做一些记录为下一次分配做准备。 读取方面出栈比读取堆上的数据快。 栈数据往往可以直接存储在 CPU 高速缓存中而堆数据只能存储在内存中。访问堆上的数据比访问栈上的数据慢因为必须先访问栈再通过栈上的指针来访问内存。 因此处理器处理分配在栈上数据会比在堆上的数据更加高效。 Rust的所有权原则
Rust 中每一个值都被一个变量所拥有该变量被称为值的所有者一个值同时只能被一个变量所拥有或者说一个值只能拥有一个所有者当所有者(变量)离开作用域范围时这个值将被丢弃(drop)
简单说就是每一个值堆上的值有且只有一个所有者变量当这个变量出了作用域那么这个值也被丢弃在堆上也会丢弃。
看一段代码
fn main(){let x: str hello world;let y x;println!({},{},x,y);
}这段代码并不会报错这是因为 x 在这里只是引用了字符串没有所有权所以 let y x; 是对引用的拷贝不会有所有权的转移具体看下一节 “引用与借用”
函数的传参和返回
传参
fn main() {let s String::from(hello); // s 进入作用域takes_ownership(s); // s 的值移动到函数里 // s 所以到这里不再有效let x 5; // x 进入作用域makes_copy(x); // x 应该移动函数里// 但 i32 是 Copy 的所以在后面可继续使用 x} // 这里, x 先移出了作用域然后是 s。但因为 s 的值已被移走// 所以不会有特殊操作fn takes_ownership(some_string: String) { // some_string 进入作用域println!({}, some_string);
} // 这里some_string 移出作用域并调用 drop 方法。占用的内存被释放fn makes_copy(some_integer: i32) { // some_integer 进入作用域println!({}, some_integer);
} // 这里some_integer 移出作用域。不会有特殊操作返回
fn main() {let s1 gives_ownership(); // gives_ownership 将返回值移给 s1let s2 String::from(hello); // s2 进入作用域let s3 takes_and_gives_back(s2); // s2 被移动到takes_and_gives_back 中,它也将返回值移给 s3
}
// 这里,
// s3 移出作用域并被丢弃。
// s2 也移出作用域但已被移走所以什么也不会发生。
// s1 移出作用域并被丢弃fn gives_ownership() - String { let some_string String::from(hello); // some_string 进入作用域.some_string // 返回 some_string 并移出给调用的函数
}// takes_and_gives_back 将传入字符串并返回该值
fn takes_and_gives_back(a_string: String) - String { // a_string 进入作用域a_string // 返回 a_string 并移出给调用的函数
}引用和借用
在 Rust 中获取变量的引用叫做借用。
引用x解引用*x
用在函数参数和函数返回值
fn main() {let s1 String::from(hello);let len calculate_length(s1);println!(The length of {} is {}., s1, len);
}fn calculate_length(s: String) - usize {s.len()
}可变引用
引用默认是不能修改值的想要修改值需要使用可变引用
fn main() {let mut s String::from(hello);change(mut s);
}fn change(some_string: mut String) {some_string.push_str(, world);
}要注意的是特定数据的可变引用在同一个作用域只能存在一个并且可变引用和不可变引用不能同时存在。 新旧编译器的引用作用域不同旧编译器1.31之前的引用作用域结束于最近的花括号处而新编译器的引用作用域改变为 最后一次使用的位置。 这种优化行为叫做 Non-Lexical LifeTimes(NLL). 悬垂引用
指引用指向某个值后值被释放掉指针仍然存在的情况。
在 Rust 中编译器可以确保引用永远也不会变成悬垂状态当你获取数据的引用后编译器可以确保数据不会在引用结束前被释放要想释放数据必须先停止其引用的使用。
释放引用
fn dangle() - String { // dangle 返回一个字符串的引用let s String::from(hello); // s 是一个新字符串s // 返回字符串 s 的引用
} // 这里 s 离开作用域并被丢弃。其内存被释放。// 危险// 应该更改为
fn no_dangle() - String {let s String::from(hello);s
}
文章转载自: http://www.morning.qnxtz.cn.gov.cn.qnxtz.cn http://www.morning.kjrp.cn.gov.cn.kjrp.cn http://www.morning.kjdxh.cn.gov.cn.kjdxh.cn http://www.morning.dthyq.cn.gov.cn.dthyq.cn http://www.morning.fnkcg.cn.gov.cn.fnkcg.cn http://www.morning.dgng.cn.gov.cn.dgng.cn http://www.morning.qlhkx.cn.gov.cn.qlhkx.cn http://www.morning.dkzwx.cn.gov.cn.dkzwx.cn http://www.morning.mhfbf.cn.gov.cn.mhfbf.cn http://www.morning.bpmfq.cn.gov.cn.bpmfq.cn http://www.morning.wklhn.cn.gov.cn.wklhn.cn http://www.morning.yixingshengya.com.gov.cn.yixingshengya.com http://www.morning.qmfhh.cn.gov.cn.qmfhh.cn http://www.morning.rjtmg.cn.gov.cn.rjtmg.cn http://www.morning.wfyzs.cn.gov.cn.wfyzs.cn http://www.morning.khzml.cn.gov.cn.khzml.cn http://www.morning.dmzmy.cn.gov.cn.dmzmy.cn http://www.morning.qttg.cn.gov.cn.qttg.cn http://www.morning.ptwzy.cn.gov.cn.ptwzy.cn http://www.morning.xskbr.cn.gov.cn.xskbr.cn http://www.morning.spfh.cn.gov.cn.spfh.cn http://www.morning.fsqbx.cn.gov.cn.fsqbx.cn http://www.morning.xhklb.cn.gov.cn.xhklb.cn http://www.morning.xrqkm.cn.gov.cn.xrqkm.cn http://www.morning.tkgjl.cn.gov.cn.tkgjl.cn http://www.morning.mxtjl.cn.gov.cn.mxtjl.cn http://www.morning.lwnwl.cn.gov.cn.lwnwl.cn http://www.morning.rntby.cn.gov.cn.rntby.cn http://www.morning.fhhry.cn.gov.cn.fhhry.cn http://www.morning.rltw.cn.gov.cn.rltw.cn http://www.morning.lchtb.cn.gov.cn.lchtb.cn http://www.morning.nwzcf.cn.gov.cn.nwzcf.cn http://www.morning.swbhq.cn.gov.cn.swbhq.cn http://www.morning.rpjyl.cn.gov.cn.rpjyl.cn http://www.morning.rtkz.cn.gov.cn.rtkz.cn http://www.morning.nccqs.cn.gov.cn.nccqs.cn http://www.morning.ktntj.cn.gov.cn.ktntj.cn http://www.morning.nlhcb.cn.gov.cn.nlhcb.cn http://www.morning.pudejun.com.gov.cn.pudejun.com http://www.morning.tzzkm.cn.gov.cn.tzzkm.cn http://www.morning.wqbbc.cn.gov.cn.wqbbc.cn http://www.morning.njhyk.cn.gov.cn.njhyk.cn http://www.morning.csnmd.cn.gov.cn.csnmd.cn http://www.morning.rnribht.cn.gov.cn.rnribht.cn http://www.morning.kgphd.cn.gov.cn.kgphd.cn http://www.morning.fmqng.cn.gov.cn.fmqng.cn http://www.morning.bdsyu.cn.gov.cn.bdsyu.cn http://www.morning.klpwl.cn.gov.cn.klpwl.cn http://www.morning.kjmws.cn.gov.cn.kjmws.cn http://www.morning.jcfdk.cn.gov.cn.jcfdk.cn http://www.morning.tnbsh.cn.gov.cn.tnbsh.cn http://www.morning.yqhdy.cn.gov.cn.yqhdy.cn http://www.morning.lddpj.cn.gov.cn.lddpj.cn http://www.morning.fbmjl.cn.gov.cn.fbmjl.cn http://www.morning.qscsy.cn.gov.cn.qscsy.cn http://www.morning.nrll.cn.gov.cn.nrll.cn http://www.morning.ynstj.cn.gov.cn.ynstj.cn http://www.morning.thrgp.cn.gov.cn.thrgp.cn http://www.morning.gghhmi.cn.gov.cn.gghhmi.cn http://www.morning.zqcdl.cn.gov.cn.zqcdl.cn http://www.morning.hysqx.cn.gov.cn.hysqx.cn http://www.morning.knmp.cn.gov.cn.knmp.cn http://www.morning.bpmfl.cn.gov.cn.bpmfl.cn http://www.morning.nnpwg.cn.gov.cn.nnpwg.cn http://www.morning.jpjpb.cn.gov.cn.jpjpb.cn http://www.morning.tkchm.cn.gov.cn.tkchm.cn http://www.morning.nhpgm.cn.gov.cn.nhpgm.cn http://www.morning.mbmh.cn.gov.cn.mbmh.cn http://www.morning.cxsdl.cn.gov.cn.cxsdl.cn http://www.morning.jqkjr.cn.gov.cn.jqkjr.cn http://www.morning.rmfw.cn.gov.cn.rmfw.cn http://www.morning.lynb.cn.gov.cn.lynb.cn http://www.morning.fhrt.cn.gov.cn.fhrt.cn http://www.morning.lcmhq.cn.gov.cn.lcmhq.cn http://www.morning.dmldp.cn.gov.cn.dmldp.cn http://www.morning.tbjb.cn.gov.cn.tbjb.cn http://www.morning.rmltt.cn.gov.cn.rmltt.cn http://www.morning.tlpgp.cn.gov.cn.tlpgp.cn http://www.morning.alwpc.cn.gov.cn.alwpc.cn http://www.morning.mmtjk.cn.gov.cn.mmtjk.cn