- ベストアンサー
C/C++言語のメモリについて
C言語でメモリを2種類?に分けると、スタックとヒープがあります。 ヒープは mallocなどで確保し、freeで解放しますがスタックは解放する必要がありません。 そのスタックは通常、何バイトまで可能なのでしょうか? あと関数外のファイルの先頭に int[1000000];とした場合、このメモリはmallocで確保していませんが、 どこに作られるのでしょうか? 私のパソコンはメモリが2GBでWindows2000ですが、CやC++で最大、何バイトまでメモリが使えますか? また、一番多くメモリを確保できるなら、OSはなんでも構いません。 解釈等も間違っていたらご指摘していただきたいです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
マイコン向けのプログラムを書いてます、Interestと申します。 > C言語でメモリを2種類?に分けると、スタックとヒープがあります。 間違いではありませんが、ちょっと足りません。プログラムで使用するメモリはもう少し細かく見ると、次のようになっています。 (P) 実行される命令(ProgramとかCodeと呼ばれます) (C) 定数など変更されないデータ (D) 初期化されるデータ (B) 初期化されないデータ (H) プログラムから動的に割り当てられるメモリプール(これがヒープです) (S) ローカル変数、関数の引数、呼び出し元関数へのリンクに使用する比較的短命なものに使用するメモリプール(これがスタックです) > そのスタックは通常、何バイトまで可能なのでしょうか? 開発環境によって初期値が決まっているようで、どれだけ割り当てるか変更できるようです。OSには依存しません。Visual C++ 6.0の場合、スタックサイズの初期値は1MBだそうです。 参考 http://okwave.jp/qa2645032.html > あと関数外のファイルの先頭に int[1000000];とした場合、 > このメモリはmallocで確保していませんが、どこに作られる > のでしょうか? 最初に説明した内容に照らすと、一般に外部変数は0で初期化されますから、(D) 初期化されるデータ の領域に確保されることがわかります。 > 私のパソコンはメモリが2GBでWindows2000ですが WindowsなどのOSは物理メモリが足りなければハードディスク上の仮想メモリも使用しますので、単純に何バイトまで使えます、とはお答えできません。 > 一番多くメモリを確保できるなら、OSはなんでも構いません。 どのようなプログラムを組もうとしているのですか?
その他の回答 (5)
- jacta
- ベストアンサー率26% (845/3158)
> 一番多くメモリを確保できるなら、OSはなんでも構いません。 それならOSなんか使わずに、ハードウェアを直接制御した方が多くのメモリを使えます。 OSもメモリを使いますので、OSがなければその分余分にメモリを使えます。 また、どんなCPUを使うかは知りませんが、特権モードで動作させればすべてのメモリ空間を扱うことができます。
- furyfox
- ベストアンサー率56% (58/103)
すみません。スタックデフォルト2Mと書きましたが他の方の指摘の通り1MBが正しいです。 ところでWindowsやLinuxで扱えるアドレスというのは直接物理アドレスを指定できるわけではなく malloc(HeapAlloc)で返るのは仮想メモリ空間のアドレスです。物理メモリがどうなっているかは 特殊なツールを使えばわかりますが、基本的にはCPU以外から参照できません。 malloc(1,000,000,000)、これはできなくても malloc(1,000,000)を1000回取ることは可能だったりします。 それは他の方のいわれるように仮想メモリという使われていないメモリはハードディスクにスワップする 仕組みがあるからです。 ちなみにWindowsXp(32bit)の場合、OS自体は3GBのメモリまで認識できますが 1プロセスが確保できる場合は合計で2GBまでです。 また4GB超のアドレスを使いたい場合は普通、64bitオプションを指定する必要があります。 (void*のサイズが64bitになります。) 最近になって特にメモリを大量に必要とする グラフィック関連のツールやモデラー、ゲームの中には64bit対応したものも出てきています。 有名メーカーのドライバ等も64bit対応してきましたし、今は32bitからの移行期ですね。
- zwi
- ベストアンサー率56% (730/1282)
>ヒープは mallocなどで確保し、freeで解放しますがスタックは解放する必要がありません。 >そのスタックは通常、何バイトまで可能なのでしょうか? スタックは関数からリターンするときに解放される為、自分で解放を意識する必要はありません。自動変数はスタック領域に作成されていますので、スタックサイズを超える自動変数は作成してはいません。 で、実際のスタックサイズは他の方が書かれている通りで、VS2005でもデフォルトは1MBみたいです。もちろんオプションで変更可能です。 >あと関数外のファイルの先頭に int[1000000];とした場合、このメモリはmallocで確保していませんが、 >どこに作られるのでしょうか? windowsのメモリ空間から確保されます。mallocで使用するヒープ領域もメモリ空間から確保されています。 ここはWindowsAPIのメモリ関数を勉強すれば、ある程度分かると思います。キーワードは、VirtualAllocとHeapAllocです。理解するためには仮想記憶の知識も必要となりますのでまず勉強してください。 >私のパソコンはメモリが2GBでWindows2000ですが、CやC++で最大、何バイトまでメモリが使えますか? >また、一番多くメモリを確保できるなら、OSはなんでも構いません。 32bitのWindowsでの動作に限った話をすると、1つのプロセス(プログラム)に割り当てられる仮想記憶空間の最大値は4GBで、これは絶対に越えられないメモリ最大値です。 実際には実メモリサイズを超えると実行速度は著しく低下しますから実用レベルで使うには2GBが限界になります。 しかし、2GBも実際にはOSやら他のプログラムがメモリを使用していますし、ファイルのキャッシュとして使われるメモリもある程度必要になりますので、1.2~1.3GB程度が自分のプログラムに使える限界ではないでしょうか? 64bitのOSと64bitで動くCPUを組み合わせれば、4GBを超えることは可能ですが、そこまでメモリが必要なプログラムは設計に何か問題がある気がします。
- furyfox
- ベストアンサー率56% (58/103)
Windows + Visual C++の場合、 int a[1000000];にしてもグローバルならヒープにとられるし、関数内ならスタックにとられます。 またメモリを2G搭載しても実際連続領域で取ることができるのは 1Gも無いと思います。(メモリは断片化しています。) malloc(1000000000)とすると恐らく取得に失敗します。 メモリがどれだけ確保できるかはOSの問題であって言語の問題ではありません。 Windowsのmallocも内部でAPIが呼ばれているにすぎません。 Windowsで一番多くメモリを取りたいなら Vista Ultimate 64bit版でしょうか。こちらは最大128Gまで物理メモリを認識する事が出来ます。 (ただし一般に市販されているマザーボードに載るのは大体8GがMAXだと思います。) Solaris64bit版等のサーバー向けの64bit OSなら更に多くのメモリが確保できるかもしれません。 スタックは解放する必要があるのではなく、関数等終了と同時にその領域が使えなくなるというだけです。 普通コンパイル時にスタックのサイズは固定で決めます。 何も指定しないと例えばVisual C++6.0の場合だと2MByteだったと思います。
- a-saitoh
- ベストアンサー率30% (524/1722)
スタックサイズの通常の大きさという物はありません。 利用者が、自分の必要に応じて設定する物です。 特に何も設定しない場合の大きさは、OS,コンパイラごとに違います。 スピードに目をつぶるならば、メモリの搭載サイズを超えて割り当てることも可能です(ページファイルが使われる)。 まずは、Cの名前空間と変数の寿命についてちゃんと勉強することをお勧めします。