gpt4 book ai didi

c++ - 我如何找出可用堆栈空间的大小?

转载 作者:行者123 更新时间:2023-11-30 02:21:04 27 4
gpt4 key购买 nike

我们都知道堆栈是向下增长的,所以如果我们找到最后声明变量的地址,我们会得到堆栈中最小的地址,所以我们可以假设这个地址将是我们剩余的可用堆栈。

我做到了,我得到了巨大的地址 {0x000000dc9354f540} = {947364623680} 我们知道堆栈向下增长并且我们知道我们不能低于 0。所以有点数学:

947364623680 / (1024*1024*1024) = 882.302060425

--> 他们是否暗示我的机器上有 882Gb 的堆栈?!

我对其进行了测试,在堆栈上分配了额外的 2mb 后,显然得到了堆栈溢出异常:

uint8 array[1024*1024*2] = {};

我的问题来了 WTF 是这个,我怎样才能得到我的实际堆栈大小?

最佳答案

因为你的问题有一个标签“visual-studio-debugging”,我假设你使用的是 Windows。

首先你应该得到当前的堆栈指针。获取本地虚拟变量的地址(就像你现在做的那样),或者通过原始 asm 读取 esp/rsp,或者获取本地虚拟变量的地址(比如你现在做了),或者通过调用 GetThreadContext 的 Win32 API 获取 CPU 注册)。

现在,为了找出可用的堆栈大小,您可以使用 VirtualQuery 查看此虚拟内存区域的起始地址(也称为分配基地址)。基本上减去这些指针会给你剩余的堆栈大小(精度达到当前堆栈帧的大小)。

很久以前我写了一个article about this subject ,包括查询当前分配/保留的堆栈大小。如果需要,您可以在那里找到更多信息:

Do they imply that i have 882Gb of stack on my machine?!

它与“您机器上的堆栈”无关。它是关于虚拟地址空间的,它与系统中可用的物理存储(RAM + 页面文件)无关。

关于c++ - 我如何找出可用堆栈空间的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48955546/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com