2012-10-15 20 views
3

我正在使用VC++ 2012. 我想知道当前线程中有多少堆栈内存可用。如何查找使用vC++在当前线程的堆栈上留下了多少空间?

快速搜索指向使用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; 
} 
+0

“快速搜索”您在哪里看到C++具有这种功能的说法? –

+0

我将修改问题。谢谢。 – enko

+0

[This](http://stackoverflow.com/questions/2480095/thread-stack-size-on-windows-visual-c)可能会有用。 – nickolayratchev

回答

1

没有这样的功能在C++ stackavail(),尽管一些编译器,诸如“打开WATCOM C++”提供它作为一个扩展。

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

+0

@Seth:我试图做一个故意指出,“C++”*是*标准中定义的内容。谢谢,不过。 –

+1

好吧,我只是想具体(即我可以写一个名为'stackavail'的函数,然后在C++中会有这样的功能),但如果你认为它是好的,那么好吧。 –

+0

你是对的,编辑过的问题。 – enko

1

好,所以这些都是我迄今为止的发现。

在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) 
} 

此外:

在窗口/ VC++默认堆栈空间被设定在每个线程1MB。 要为main()线程设置较高值,您必须通过/ STACK的链接器标志进行编译:####将四舍五入为最接近的四位。例如:/ STACK:2097152代表2MB堆栈。

希望这可以帮助别人。

+1

您在询问可用于'当前线程'的堆栈,这意味着您想在多线程应用程序中使用它。如果是这种情况,我强烈建议修复'stackavail'函数,因为它绝对不是线程安全的。 – sirgeorge

2

这使用了一些堆栈,但是线程安全并且不需要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;  
} 
+0

谢谢,我会在我的注意力回到C++时测试它,并将其标记为答案。 – enko

相关问题