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

Chr*_*oph 5 heap stack 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);
}
Run Code Online (Sandbox Code Playgroud)

版画

0x1
0x1
Run Code Online (Sandbox Code Playgroud)

然后

struct SomeStruct;

fn main() {
    let some_thing = &SomeStruct;
    println!("{:p}", some_thing);
    foo(some_thing);
}

fn foo (bar: &SomeStruct) {
    println!("{:p}", bar);
}
Run Code Online (Sandbox Code Playgroud)

版画

0x10694dcc0
0x10694dcc0
Run Code Online (Sandbox Code Playgroud)

我可以看到堆分配版本的内存地址要短得多,但我不知道这是否是一种可靠的方法来区分它.我想知道是否有类似的东西std::foo::is_heap_allocated()

Jor*_*eña 7

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

我认为您可以end()使用end参数通过系统调用获得堆的开始。因此,堆的下界将是 的结果,end(end)而上界将是sbrk(0)