有什么方法可以在运行时确定可用的堆栈空间?[英] Is there any way to determine the available stack space at run time?

本文是小编为大家收集整理的关于有什么方法可以在运行时确定可用的堆栈空间?的处理方法,想解了有什么方法可以在运行时确定可用的堆栈空间?的问题怎么解决?有什么方法可以在运行时确定可用的堆栈空间?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我知道堆栈大小是固定的.因此,我们无法将大对象存储在堆栈上,我们转移到动态分配(例如Malloc).另外,当功能调用嵌套时,使用堆栈,因此我们也避免出现递归功能.在运行时有什么办法可以确定到目前为止使用多少堆栈内存以及剩下多少?

在这里,我假设具有X86架构的Linux环境(GCC编译器).

推荐答案

只需阅读%ESP即可,并记住其值下降.您已经知道环境中的默认最大大小以及线程的起点.

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()周围有一个包装器,因此每个线程都以我的私有功能启动.在该功能中,我找到了如上所述的堆栈,然后找到未使用的部分,然后以独特的模式初始化该记忆(或" Patton",就像我的萨默维尔(Somerville),男女岳父所说的那样).

然后,当我想知道使用了多少堆栈时,我从顶部开始,然后朝底部搜索不符合我的模式的第一个值.

其他推荐答案

如果您的应用程序需要确保它可以使用X MB内存,则通常的方法是在启动时向其分配该过程(如果无法为最低要求提供最低要求,则无法启动).

当然,这意味着该应用程序必须采用自己的内存管理逻辑.

本文地址:https://www.itbaoku.cn/post/359313.html