2

Cで書き込む場合、プログラムを起動したときにメモリで使用可能なスタックスペースを確認するにはどうすればよいですか?ヒープスペースはどうですか?

プログラムの実行中に使用されているメモリの量を確認するにはどうすればよいですか?

4

3 に答える 3

2

教育的または情報的な理由ではなく、実用的な理由でこの種の質問をする必要がある場合、あなたは深刻な問題を抱えているという哲学があります。

エラーチェックやプログラムに十分なメモリがあることを確認するためにこれを要求している場合は、など...それなら、真剣に心配しないでください。プログラムのメモリに関しては、これがデバッグ専用の場合は、タスクマネージャ(Windows上)を使用できます。あなたがあなたのプログラムでこれを知る必要があるならば、私はどんな非ハッキーな解決策も当てにしないでしょう。

于 2010-09-25T11:56:48.140 に答える
2

これはすべてWin32固有です(実際にはC固有ではなく、すべてOS APIのみです)。

スレッドが作成されると、デフォルトで1MBのスタックスペースが取得されます。これにより、使用するCreateThreadAPIで変更できます。

スレッド情報ブロックを調べて実際のスタック情報を見つけることができますが、これは文書化されていますが、この手法は公式にはサポートされていません。http://en.wikipedia.org/wiki/Win32_Thread_Information_Blockを参照してください。

また、32ビットアプリケーションの場合、アドレス指定できるのは最大2 GBまでです。したがって、設計上大量のメモリを使用するアプリの場合、注意すべき点は、プロセスの仮想アドレス空間の合計サイズ(コミット済み+予約済み)、これにはすべてのヒープ割り当てが含まれます。GlobalMemoryStatusEx APIを使用して、プログラムでプロセスの仮想メモリにアクセスできます。仮想アドレス空間のullTotalVirtualパラメータを確認してください。プロセスが1.8GBまたは1.9GBのVASに近づくと、ヒープ割り当てとVirtualAlloc呼び出しは失敗し始めます。「通常の」アプリの場合、VASが不足することを心配する必要はありませんが、割り当ての失敗をチェックすることは常に良いことです。また、バグや悪いデザインがない限り、スタックオーバーフローが発生することはありません。

于 2010-09-25T13:50:37.460 に答える
1

理由による抽象化 実際、あなたのプログラムはこれを懸念すべきではありません。これはOSの懸念事項であり、問​​題は必要なものだけで効率的であり、OSにその仕事を任せる必要があります。

あなたが主張するなら、あなたは、、、/proc/meminfoそしてbrk()getrlimit()ここsetrlimit()いくつかのドキュメントがあります)近似とラフっぽさのためのRLIMIT_STACKと値で調べることができます。RLIMIT_DATA

#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main (int argc, char *argv[])
{
  struct rlimit limit;

  /* Get the stack limit. */
  if (getrlimit(RLIMIT_STACK, &limit) != 0) {
    printf("getrlimit() failed with errno=%d\n", errno);
    exit(1);
  }

  printf("The stack soft limit is %llu\n", limit.rlim_cur);
  printf("The stack hard limit is %llu\n", limit.rlim_max);
  exit(0);
}

ここから変更されたman getrlimitシステムも参照してください

あなたがこれをしたいこと理由を述べるならば、誰かがあなたがしたいことをするより良い方法または方法を持っているかもしれません。

于 2010-09-25T12:00:58.597 に答える