学Rust要有大局观(二) Rust的精髓

学Rust要有大局观(二) Rust的精髓

上一篇(学Rust要有大局观)我们从rust的安装部署,到cargo的基本使用,给大家做了科普,为了保证可以降低Rust的学习难度,一开始我们必须扫除掉除了基本语法之外的核心难点,这一篇我们关注于所有权(+生命周期)这个Rust最难学的部分, 但是梁小孩今天十分钟之内争取让你有学习Rust的战略思维,不再纠结于各种教程的说法,让你快速了解原理。

Rust精髓

我尝试用几个简单的词汇说明Rust的设计精髓和底层原理,方便对比其他语言和Rust的不同之处

  • Rust变量具有阅后即焚的特性, 相比之下其他语言的变量都是耐用品, 而Rust的变量属于一次性用品
  • Rust语言中变量使用值拥有是明确区分的,而且其他语言的变量等号基本都是赋值,但是Rust是所有权让渡

三种常见的内存模式

从下面三行伪代码, 加单的赋值语句, 我们直观感受一下c++,python, 还有Rust的不同处理方式

# c++代码,仅仅用来说明简单逻辑
auto s = std::vector<std::string>{ "udon", "ramen", "soba" }; 
auto t = s; 	// 第一次使用s
auto u = s;	// 第二次使用s
c++ will copy

c++-copy
栈内的变量一直增长(从左往右),变量也一直可以被访问使用. 而且栈到堆的指向关系互相交织(网状);
由于C++默认采用copy的方式进行operator=的操作,即使是std::vector复杂的STL结构,都是直接复制,鉴于这种默认动作开销比较大,一般程序员会手工引入引用或者指针来优化(问题随之而来,栈到堆的指针迟早变成网)

Python will count

python3-count
对于python而言,由于有gc的存在,gc采用了reference count技术,所以逻辑层次上多了一个PyObject的中间层,保存了计数信息,由于采用的是计数机制,而python栈上的变量都是对同一个值的多个引用,修改其中一个总是会让其他变量的值也都一起变化

Rust will move (and crush!!)

rust-will-move-and-crush
对于Rust而言,变量的赋值操作等同于值拥有权的让渡, 它的意义就是auto t = s;这种语句一旦执行,相当于栈变量t取代了栈变量s,拥有了底层的值, 随之而来的就是s在编译阶段就被编译器标识为不再可用; 这是rust编译器处理代码的逻辑,所以auto u = s;这样的语句根本不会通过编译,更无需再考虑代码执行;x
这一切都发生在代码分析阶段,编译过程中, 不管是简单的赋值,还是被函数形参,还是一个值被从函数返回: 都是直接的管理权让渡

思考题

一个for循环,内部一个print函数打印了上面列表,这样一个简单的逻辑不同的语言会出现什么样的内存结果?

  • c++ OK, s可以再次被赋值使用,打印,进行各种操作
  • Python OK, s也可以正常使用
  • Rust OK, 可以正常打印,但是for训话结束之后,所有字符串堆中的资源都被释放了, s变成了不可再用的变量

好了,是不是感觉太神奇了~~, Rust对变量的使用就是直接拿来,如果没有新的上下文接受让渡, 变量就被直接销毁了, 这个神奇的设定就是Rust有别于其他各种语言,并且会有move sematicborrow, lifetime的最底层设定, 这就是rust的游戏规则.

简单发散思考, 这个神奇的move sematic设定会导致什么样的直观现象呢,类似与c++,java,python各种语言其实随着程序一点一点执行,可能会有成百上千的object产生,其中的变量指针,引用,copy互相交织在一起,看起来就会乱糟糟的,这常被称之为对象之海(如下图)

a sea of objects

由于rust特立独行的底层游戏规则,不管程序运行了多久,逻辑上看来,不管对象内部有多少子元素,列表还是字典,永远只有一个root(拥有它), 再加上我们将要说到的使用权的限制,Rust的堆栈变量总是非常干净清楚(给你了,你就是owner), 你不会有类似c++中三方库函数返回了一个指针, 我应该free?的疑问.(如下图)

rust object tree

本文简答说明了Rust最核心的底层设计,关于所有权的相关内容,我们可以详细展开了, 敬请期待

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值