4
我不知道是否有辦法找出一個變量是堆棧還是堆分配。如何判斷是否有堆或堆棧分配?
考慮一下:
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()
想到的第一個問題是*「爲什麼?」*。什麼樣的代碼會與這些知識有所不同? – Shepmaster
我不需要這個代碼來發現任何不同於發現語言的東西:) – Christoph
0x1是Rust分配器爲零大小對象返回的虛擬地址,它不在堆上。參見[heap.rs#L90](https://github.com/rust-lang/rust/blob/9ecc9896dedb426e3f4eb3d23dfc60192fe5275f/src/liballoc/heap.rs#L90)。 – thelink2012