【发布时间】:2015-07-21 08:08:53
【问题描述】:
我想知道是否有办法确定变量是堆栈分配的还是堆分配的。
考虑一下:
struct SomeStruct;
fn main() {
let some_thing = Box::new(SomeStruct);
println!("{:p}", some_thing);
foo(&*some_thing);
}
fn foo (bar: &SomeStruct) {
println!("{:p}", bar);
}
打印
0x1
0x1
然后
struct SomeStruct;
fn main() {
let some_thing = &SomeStruct;
println!("{:p}", some_thing);
foo(some_thing);
}
fn foo (bar: &SomeStruct) {
println!("{:p}", bar);
}
打印
0x10694dcc0
0x10694dcc0
我可以看到堆分配版本的内存地址要短得多,但我不知道这是否是区分差异的可靠方法。不知道有没有类似std::foo::is_heap_allocated()
【问题讨论】:
-
首先想到的问题是“为什么?”。有了这些知识,什么样的代码会有不同的工作方式?
-
我不需要这段代码来比更多地发现语言:)
-
0x1是 Rust 分配器为零大小对象返回的虚拟地址,它不在堆上。见heap.rs#L90。 -
我也有同样的问题。我想知道,因为我感兴趣的是这件事是如何在幕后工作的。例如,这个简单的例子似乎显示了几乎连续地址 play.rust-lang.org/… 中的所有内容。我现在想知道是否所有对堆的引用都占用了堆栈空间,它给了我对堆的堆栈引用的地址。
-
@MrMesees 所有地址都是连续的,因为您只获取(和打印)堆栈地址:
num和dog在堆栈上,zoo是一个数组,因此它存在堆栈,虽然Vec的“存储缓冲区”是堆分配的,但您只打印 Vec 结构本身的地址(指针、长度和容量的三元组),并且在堆栈上.
标签: rust heap-memory stack-memory