如何判断堆栈或堆栈是否已分配?

时间:2015-05-10 22:13:59

标签: stack heap rust

我想知道是否有办法弄清楚变量是堆栈还是堆分配。

考虑一下:

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()

这样的东西

1 个答案:

答案 0 :(得分:4)

如果你在某些POSIX系统上,你可以使用sbrk()系统调用参数0来确定程序中断的当前位置,这是当前的限制。堆。如果给定值的地址小于此地址但大于堆的开头,那么它就在堆上。我不知道你是如何检查它是否在堆栈上,这不一定是自动替代不在堆上,因为它也可以是静态初始化或未初始化的数据,尽管这可能是显而易见的你检查代码。您可以在x86_64架构上使用rbp寄存器,该架构应指向当前堆栈帧的开头。那就是如果你想检查它是否在当前的堆栈框架上,或者如果你想检查它是否在堆栈的任何地方你可以使用rsp

我认为您可以使用end参数通过end()系统调用获取堆的开头。所以堆的下限是end(end)的结果,上限是sbrk(0)