繁体   English   中英

Rust中堆栈与堆分配的工作原理如何?

[英]How exactly do stack vs. heap allocation work in Rust?

因此,我了解这种工作方式的简单答案是,本地内容发生在堆栈中,而盒子内容发生在堆中。

但是,当您有更复杂的行为时会发生什么?

具体来说,让我们来谈谈在FFI中保存的数据不确定的时间,然后在以后从* mut c_void恢复。

如果您“忘记”一个指针,则使用std :: mem :: forget或std :: mem :: transmute()指向* const指针的指针,结果的持久性如何?

如果(例如)在函数内部完成,然后函数返回,堆栈是否被清除并且内存变为无效?

通常来说,分配给堆的“盒子”指针在被销毁之前是有效的(例如,使用read())吗?

有人在IRC上告诉我,这通常是采取的正确方法:

unsafe fn fp(v:Box<Foo>) -> *const c_void {
  return transmute(foo);
}

但是,从libcore :: raw :: Box来看,Box与* const T远不相同; 真的可以吗?

如果您“忘记”一个指针,则使用std :: mem :: forget或std :: mem :: transmute()指向* const指针的指针,结果的持久性如何?

如果通过fp函数使用Transmute转换了Box ,则指针将一直保持有效,只要transmute正在使用该值,并且释放内存的析构函数将不会运行。 (至少在将其转换回Box<...>以使析构函数运行并释放内存之前,它是有效的。)

forget没有返回值,它只是丢弃该值而无需运行析构函数。

但是请注意,以嬗变*const c_void需要格外小心,如Foo Box<Foo>可能包含线程本地数据,或者引用,因此可能是无效的线程之间传递,或长生不老。 (意味着指针本身可以永远存在/可以使用,但是您喜欢,但是它指向的数据可能无法使用。)

如果开始转换&指针,则需要非常小心生命周期,不要让它们脱离它们所指向的数据范围(例如,不能从函数返回指向局部变量的指针)。

如果(例如)在函数内部完成,然后函数返回,堆栈是否被清除并且内存变为无效?

堆栈不会被“清除”(即未显式清零),但是将任何指针用于不再存在的堆栈帧是无效的。

通常来说,分配给堆的“盒子”指针在被销毁之前是有效的(例如,使用read())吗?

你需要更具体, ptr::read不能在被称为Box直接,并呼吁ptr::read上一个*const c_void肯定不会做任何有用的。

但是,从libcore :: raw :: Box来看,Box与* const T远不相同; 真的可以吗?

raw::Box根本不是普通Box的表示形式。 raw::Box是旧@ (现在为Gc )类型的表示。 Box<T> 实际上是*mut T的包装

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM