rust8G内存够不够用_Rust是如何做到内存安全的

C++的情况

C++把内存使用分为两种情况:值对象和指针对象。值语义的对象超出作用域会自动调用析构函数销毁,传递或者赋值的时候会进行一次拷贝。指针语义则交给人肉来管理,或者使用智能指针来引用计数。

值对象在传递赋值中拷贝一次比较浪费,所以C++后来有了移动构造函数。值在移动以后,关联的数据移动到新值。

Rust是怎么做的

Rust则是在C++的基础上进一步优化。Rust的对象有一个所有者,和多个引用。

Rust只允许值有一个所有者,传递和赋值会导致所有权移动。这看起来像C++的unique_ptr,但实际上更像C++的移动语义。也就是说C++拷贝是隐式的移动是显式的,Rust移动是隐式的。当然Rust在这里有编译器的静态分析,没有运行时开销。

很多地方并不想移动值,只是借用一下,Rust引入了引用的概念,来表达指针语义。一个常见内存问题是指针指向了一个无效的内存地址,Rust却没这个问题。Rust编译器强制让你证明值的生命周期大于它的引用的生命周期。有些编译器搞不清楚的地方需要添加生命周期标记,来告诉编译器。

获取引用是把一个值取地址的过程,是很严肃的。Rust核心的地方就是在这里做了限制,保证了内存安全。

Rust的局限性

即便有了复杂的所有权和生命期机制,但遇见复杂的情况还要回到引用计数。

既要零开销抽象,又要内存安全,那么付出的代价就是代码可读性变差。所以说天下没有免费的午餐、鱼与熊掌不可兼得。希望rust能增强生命周期自动推断,减少人工标注。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值