rust这种语言粗略学了一下,跟之前学的语言有不少区别。举个例子:
https://www.zhihu.com/answer/...
上面那篇文章里面提到把变量的所有权传递给hashMap时,是把变量本身传递到hashMap,比如String本身,而不是&str(引用)。那传递变量本身时,是值复制吗?就是把整个变量都复制一份给HashMap?假如这个变量是一个很大的struct,岂不是浪费大量的内存?
rust这种语言粗略学了一下,跟之前学的语言有不少区别。举个例子:
https://www.zhihu.com/answer/...
上面那篇文章里面提到把变量的所有权传递给hashMap时,是把变量本身传递到hashMap,比如String本身,而不是&str(引用)。那传递变量本身时,是值复制吗?就是把整个变量都复制一份给HashMap?假如这个变量是一个很大的struct,岂不是浪费大量的内存?
"借用" 不是指针,它是用于引用。(Rust 有指针类型的)
所有权传递不是借用,也不需要拷贝。拷贝需要显式调用 clone 。(除非是简单类型,即实现了 Copy trait 的类型)
7 回答5.3k 阅读
1 回答3.3k 阅读
2 回答829 阅读
1 回答877 阅读
References and Borrowing
上面calculate_length中使用&String就是一个
references
, 也就是reference borrowing
,Reference VS Pointer
除此之外 Reference 与 Pointer 之前是可以转换的
数据之间的交换方式 - Move
下面是内存分布局:

其中s1的数据结构是存放在栈上,ptr指向的实际是堆地址;
当执行下面语句之后的内存布局:
此时s1已无效,也就是不能访问了; 这是Move语意
数据之间的交换方式 - Clone
在上面执行 let s1 = String::from("hello");之后如果再执行下面代码:
内存布局就是这样的:

这是Clone
数据之间的交换方式 - Copy(
Stack-Only Data
)首先注意只有栈上的数据才能有Copy,并且实现了Copy trait,当实现Copy trait之后这个值再赋给其他变量之后仍然可以使用.
上面x是integer类型并且实现了Copy trait,所以在赋给y后仍然可用
实现Copy trait的基本类型:
what-is-ownership