5

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;
}
4

3 に答える 3

5

これはいくつかのスタックを使用しますが、スレッドセーフであり、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;    
}
于 2014-01-05T05:34:51.347 に答える
2

stackavail()「OpenWatcomC++」などの一部のコンパイラは拡張機能として提供していますが、C++のような機能はありません。

この情報を本当に知る必要がある場合は、OS固有のシステムコールを使用してそれを把握してください。

于 2012-10-15T23:16:36.987 に答える
1

わかりましたので、これらはこれまでの私の調査結果です。

Windows で vc++ を介してスタック スペースをチェックする簡単な関数の方法はありません。

しかし、私は他の場所で答えを見つけました。

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 に丸められます。例: 2MB スタックの場合は /STACK:2097152。

これが誰かに役立つことを願っています。

于 2012-10-17T02:26:22.663 に答える