Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 移动的对象没有相同的地址_Rust - Fatal编程技术网

Rust 移动的对象没有相同的地址

Rust 移动的对象没有相同的地址,rust,Rust,我认为从一个绑定移动到另一个绑定的对象仅仅意味着对象本身保持不变;只是程序源使用不同的绑定标识符引用它 使用std::fmt; 结构人{ 名称:String, 年龄:u8, } 人的简单克隆{ fn克隆和自我->自我{ 人{ 名称:self.name.clone, 年龄:自我年龄, } } } impl fmt::个人指针{ fn fmt&self,f:&mut fmt::格式化程序 为什么p和q的地址不同 锈对象不是堆分配的,不像Python或java,绑定和它后面的实际对象没有区别。变量,比

我认为从一个绑定移动到另一个绑定的对象仅仅意味着对象本身保持不变;只是程序源使用不同的绑定标识符引用它

使用std::fmt; 结构人{ 名称:String, 年龄:u8, } 人的简单克隆{ fn克隆和自我->自我{ 人{ 名称:self.name.clone, 年龄:自我年龄, } } } impl fmt::个人指针{ fn fmt&self,f:&mut fmt::格式化程序 为什么p和q的地址不同

锈对象不是堆分配的,不像Python或java,绑定和它后面的实际对象没有区别。变量,比如P名称的位置,实际上存储了对象,所以移动对象并不奇怪,移动它。不像C++,RID不会在旧的移动对象上运行析构函数,所以按位移动既正确又有效


<>注意到,在优化的编译过程中,编译器不能很好地意识到Q可以重用P占用的空间,并优化迁移。正如注释中所指出的,请求和使用地址可能会导致禁用这种优化。

我是C++程序员,我想我是这样的。可以从自动变量(通常是堆栈分配的)的角度来理解它。谢谢!我知道不可能有一个简单的指针交换来完成移动,那么这里的移动是什么?编译器将如何为自定义类型(如Person)实现它?@legends2k它只是做了一个memcpy@legends2k这样看:一个字符串由三个机器字:指向数据、容量和长度的指针。在您的情况下,字符串和这三个字是堆栈分配的,因此移动对象只需将它们从一个堆栈位置逐字复制到另一个堆栈位置。指向堆分配数据的指针将保持完全有效,因为堆上的数据将保持不变,而移动是O1和非常有效的。它不会导致双自由,因为不像C++生锈,它不会运行旧的移动对象上的析构函数。@ ReNests2K所以在Road中既移动又复制……Rust实际上没有自动调用的复制构造函数。默认情况下,值被移动,如果你想要拷贝,你必须通过调用C显式地请求它。lone之后,克隆将像往常一样再次移动。实现复制的对象是例外,但这些对象禁止具有析构函数,因此仅限于包含析构函数的数字和结构。如果您想要固定地址,这就是禁止的。仅使用其地址,您可能不允许进行优化。@Starga当然,这只是一个玩具程序,可以更好地理解语言概念。谢谢!谢谢你让我们了解Pin,但想要保持内存位置不变是另一回事。我想知道的是Rust在幕后的举动。
0x7ffee28b4178  // P
0x7ffee28b41f8  // A (P's clone)
0x7ffee28b4260  // Q (moved from P)