如何确定 Rust 中的 new() 何时在堆栈或堆上分配
Posted
技术标签:
【中文标题】如何确定 Rust 中的 new() 何时在堆栈或堆上分配【英文标题】:How to determine when new() in Rust allocates on stack or heap 【发布时间】:2021-05-31 23:04:17 【问题描述】:有没有办法(除了查看实现和文档)来确定 rust 中的 new() 何时分配到堆栈或堆上?
理想情况下,我正在寻找一种在编写源代码时一目了然的方法来确定这一点。例如,可以添加限制是否可以进行堆分配的特征或参数。
【问题讨论】:
这能回答你的问题吗? How to tell if something is heap or stack allocated?new
将始终返回堆栈上的值,所以除非它返回一个已知的涉及堆的东西(例如Box
、Rc
、Vec
),否则真的没有办法知道它是否分配,至少在 Rust 开始获得更多基于分配器的 API 之前,使用分配器的东西至少告诉你它 可以 分配,尽管没有的东西并不是说它无法分配)。
@E_net4thecircusstopper,不知何故回答。但是,我更多的是考虑一种根据代码确定它的方法。所以在写 SW 的时候,我可以一目了然地了解发生了什么。
@Masklinn 似乎在 Rust 中使用基于分配器的 API 或一些限制参数会很好。
@AdamM "local" 分配器正在处理中(有an entire WG on the subject),但是全局分配器将始终存在,因此除非它是未设置全局分配器的no_std
代码库,否则它总是可能的让被调用者在幕后分配。
【参考方案1】:
Rust 中名为 new()
的函数无论如何都不是特殊的。所以不,您不能轻易确定此类函数返回的内容是否拥有任何堆分配的数据。即使对于std::default::Default
trait 实现,也没有限制或约定阻止default()
方法进行堆分配,通常也没有记录。
【讨论】:
谢谢。这证实了我的假设。似乎某种分配限制在 rust 中非常有用,尤其是在嵌入式或性能关键型应用程序中。以上是关于如何确定 Rust 中的 new() 何时在堆栈或堆上分配的主要内容,如果未能解决你的问题,请参考以下文章
如何确定 DST 何时在 Python 中的特定位置开始或结束? [复制]