rust - 如何判断某些东西是堆分配的还是堆栈分配的?

标签 rust heap-memory stack-memory

我想知道是否有办法判断一个变量是分配在栈上还是堆上。

考虑一下:

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

的东西

最佳答案

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

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

关于rust - 如何判断某些东西是堆分配的还是堆栈分配的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30157201/

相关文章:

rust - 找不到指定的过程。 (操作系统错误 127) - #![plu​​gin(rocket_codegen)]

c++ - 为什么编译器只为 int 保留 0x10 位?

rust - 为什么这个借用仍然是 "active"?

rust - 创建可变迭代器时出现生命周期错误

使用rust 错误 "cannot determine a type for this expression"

java - 帮助更改 OSX Eclipse Java 堆分配

c++ - 对 std::stack 指针调用删除

c++ - 什么时候使用新关键字?

c++ - 使用没有堆内存分配的接口(interface)的框架应用程序?