gpt4 book ai didi

c - 有没有办法在运行时确定可用的堆栈空间?

转载 作者:IT王子 更新时间:2023-10-29 00:13:44 25 4
gpt4 key购买 nike

我知道堆栈大小是固定的。所以我们不能在堆栈上存储大对象,我们转向动态分配(例如 malloc)。此外,当存在函数调用嵌套时会使用堆栈,因此我们也因此避免了递归函数。有没有办法在运行时确定到目前为止使用了多少堆栈内存以及还剩下多少?

在这里,我假设使用 x86 架构的 linux 环境(gcc 编译器)。

最佳答案

有一个 pthread API 可以确定堆栈的位置:

#include <pthread.h>

void PrintStackInfo (void)
{ pthread_attr_t Attributes;
void *StackAddress;
int StackSize;

// Get the pthread attributes
memset (&Attributes, 0, sizeof (Attributes));
pthread_getattr_np (pthread_self(), &Attributes);

// From the attributes, get the stack info
pthread_attr_getstack (&Attributes, &StackAddress, &StackSize);

// Done with the attributes
pthread_attr_destroy (&Attributes);

printf ("Stack top: %p\n", StackAddress);
printf ("Stack size: %u bytes\n", StackSize);
printf ("Stack bottom: %p\n", StackAddress + StackSize);
}

在 i386 上,堆栈从底部开始向顶部增长。

所以您知道您有 ($ESP - StackAddress) 字节可用。

在我的系统中,我有一个围绕 pthread_create() 的包装器,因此每个线程都在我的私有(private)函数中启动。在该函数中,我如上所述找到堆栈,然后找到未使用的部分,然后使用独特的模式(或“巴顿”,正如我出生在马萨诸塞州萨默维尔的岳父所说)初始化该内存。

然后当我想知道有多少堆栈已被使用时,我从顶部开始并向底部搜索第一个与我的模式不匹配的值。

关于c - 有没有办法在运行时确定可用的堆栈空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1693842/

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