【问题标题】:How can I find out how much space is left on stack of the current thread using vc++?如何使用 vc++ 找出当前线程的堆栈上剩余多少空间?
【发布时间】:2012-10-05 23:58:39
【问题描述】:

我正在使用 VC++ 2012。 我想知道当前线程中有多少堆栈内存可用。

快速搜索指向使用 malloc.h 和 stackavail() 函数,但它在 Visual C++ 2012 中不存在。我该如何以另一种方式实现这一目标?

有问题的例子是这样的:

#include "stdafx.h"
#include <iostream>
#include <malloc.h>

using namespace std;

int _tmain()
{
    cout << "Available stack: " << stackavail() << std::endl;
}

【问题讨论】:

  • “快速搜索”你在哪里看到C++有这样一个功能的说法?
  • 我会修改问题。谢谢。
  • This 可能有用。
  • 感谢 Lightness,如果我理解正确,它会返回总堆大小。我正在专门寻找本地线程堆栈大小以找出剩余的可用空间量。

标签: c++ visual-c++


【解决方案1】:

在 C++ 中没有像 stackavail() 这样的函数,尽管一些编译器,例如“Open Watcom C++”将它作为扩展提供。

如果您真的需要了解这些信息,请使用特定于操作系统的系统调用来解决。

【讨论】:

  • @Seth:我试图明确指出“C++”标准中定义的内容。不过,谢谢。
  • 好吧,我只是想具体一点(即我可以编写一个名为 stackavail 的函数,然后在 C++ 中就会有这样的函数),但如果你认为它很好,那好吧。跨度>
  • @Seth:我知道你来自哪里。就我个人而言,即使那样我也永远不会称它为“C++ 中的函数”,但我可以理解如果有人说“用 C++ 编写的函数”或“C++ 程序中的函数”,他们可能会这样说。
【解决方案2】:

好的,这些是我目前的发现。

在 windows 上通过 vc++ 检查堆栈空间没有一种简单的方法。

但我找到了答案elsewhere

size_t stackavail()
{
    static unsigned StackPtr;   // top of stack ptr
    __asm mov [StackPtr],esp    // mov pointer to top of stack
    static MEMORY_BASIC_INFORMATION mbi;        // page range
    VirtualQuery((PVOID)StackPtr,&mbi,sizeof(mbi)); // get range
    return StackPtr-(unsigned)mbi.AllocationBase;   // subtract from top (stack grows downward on win)
}

另外:

在 windows/vc++ 中,默认堆栈空间设置为每个线程 1MB。 要为 main() 线程设置更高的值,您必须通过 /STACK:#### 的链接器标志进行编译,该标志四舍五入到最接近的 4。例如:/STACK:2097152 用于 2MB 堆栈。

希望这对某人有所帮助。

【讨论】:

  • 您在询问“当前线程”可用的堆栈,这意味着您想在多线程应用程序中使用它。如果是这种情况,我强烈建议修复您的“stackavail”功能,因为它绝对不是线程安全的。
【解决方案3】:

这使用了一些堆栈,但它是线程安全的,并且不需要 asm 内联。我认为我们这些需要跟踪堆栈的人不需要精度。只是对防止溢出发生的可用方法的一个很好的估计。我们需要跟踪它,因为我们为用户提供了创建可能使用递归或其他服务或需求的宏、脚本、表达式等的能力。每个环境都应该能够报告堆栈可用性,即使它只使用所有可用内存,以便可以控制任何递归。

size_t stackavail()
{
  // page range
  MEMORY_BASIC_INFORMATION mbi;                           
  // get range
  VirtualQuery((PVOID)&mbi, &mbi, sizeof(mbi));           
  // subtract from top (stack grows downward on win)
  return (UINT_PTR) &mbi-(UINT_PTR)mbi.AllocationBase;    
}

【讨论】:

  • 谢谢,当我的注意力回到c++时我会测试它,并将其标记为答案。
猜你喜欢
  • 2012-01-12
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2014-06-29
  • 2022-09-23
  • 2012-11-14
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多