【发布时间】:2023-03-27 17:15:02
【问题描述】:
在这段代码中...
struct Test { a: i32, b: i64 }
fn foo() -> Box<Test> { // Stack frame:
let v = Test { a: 123, b: 456 }; // 12 bytes
Box::new(v) // `usize` bytes (`*const T` in `Box`)
}
...据我了解(忽略可能的优化),v 在堆栈上分配,然后复制到堆中,然后在 Box 中返回。
还有这段代码……
fn foo() -> Box<Test> {
Box::new(Test { a: 123, b: 456 })
}
...应该没有什么不同,大概是因为应该有一个用于结构分配的临时变量(假设编译器对Box::new() 中的实例化表达式没有任何特殊语义)。
我找到了Do values in return position always get allocated in the parents stack frame or receiving Box?。关于我的具体问题,它只提出了实验性的box 语法,但主要谈论编译器优化(复制省略)。
所以我的问题仍然存在:使用 stable Rust,如何在不依赖编译器优化的情况下直接在堆上分配 structs?
【问题讨论】:
-
这将是一件完全荒谬的事情,让编译器为你施展魔法。但是如果你想要doc.rust-lang.org/std/alloc/trait.Alloc.html.
-
感谢您的链接。但是,我强烈反对荒谬。我认为任何“魔法”本质上都是不可靠的,更不用说它需要编译器内部知识了。此外,当性能至关重要或资源有限时,所有内存操作都很重要,在这种特殊情况下,最好确保不执行不必要的操作。
-
我还应该注意,即使提供的链接在技术上解决了问题,我很确定这不是惯用的方式。只是水平太低了。我本可以直接为此调用分配器,并获得指向堆的原始指针。我很确定为此必须有一个语言级别(或“stdlib 级别”)的构造。
-
另一个“解决方案”是使用doc.rust-lang.org/std/boxed/struct.Box.html#method.new_uninit 那个新的所以我以前没有想到它,在我看来仍然很低。但是用它来“避免使用堆栈”是愚蠢的。
标签: rust