![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
C言語でメモリを2種類?に分けると、スタックとヒープがあります。
ヒープは mallocなどで確保し、freeで解放しますがスタックは解放する必要がありません。
そのスタックは通常、何バイトまで可能なのでしょうか?
あと関数外のファイルの先頭に int[1000000];とした場合、このメモリはmallocで確保していませんが、
どこに作られるのでしょうか?
私のパソコンはメモリが2GBでWindows2000ですが、CやC++で最大、何バイトまでメモリが使えますか?
また、一番多くメモリを確保できるなら、OSはなんでも構いません。
解釈等も間違っていたらご指摘していただきたいです。
No.3ベストアンサー
- 回答日時:
マイコン向けのプログラムを書いてます、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はなんでも構いません。
どのようなプログラムを組もうとしているのですか?
No.6
- 回答日時:
> 一番多くメモリを確保できるなら、OSはなんでも構いません。
それならOSなんか使わずに、ハードウェアを直接制御した方が多くのメモリを使えます。
OSもメモリを使いますので、OSがなければその分余分にメモリを使えます。
また、どんなCPUを使うかは知りませんが、特権モードで動作させればすべてのメモリ空間を扱うことができます。
No.5
- 回答日時:
すみません。
スタックデフォルト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からの移行期ですね。
No.4
- 回答日時:
>ヒープは 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を超えることは可能ですが、そこまでメモリが必要なプログラムは設計に何か問題がある気がします。
No.2
- 回答日時:
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だったと思います。
No.1
- 回答日時:
スタックサイズの通常の大きさという物はありません。
利用者が、自分の必要に応じて設定する物です。
特に何も設定しない場合の大きさは、OS,コンパイラごとに違います。
スピードに目をつぶるならば、メモリの搭載サイズを超えて割り当てることも可能です(ページファイルが使われる)。
まずは、Cの名前空間と変数の寿命についてちゃんと勉強することをお勧めします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- その他(パソコン・周辺機器) 回復ドライブは何回も作れますか? 4 2022/11/01 21:13
- その他(パソコン・周辺機器) タブレットで使用するUSBメモリについて 7 2022/05/26 14:27
- CPU・メモリ・マザーボード 質問お願いします 「「RAM2GB+拡張4GB」などと書いてあるのは、搭載されているメモリ(RAM) 6 2023/08/28 12:31
- Android(アンドロイド) galaxy s8+にUSBメモリ(type-c)を接続し、動画再生すると熱くなるのですが… USB 5 2022/06/24 17:21
- ノートパソコン パソコンの買い換え アドバイスください。初心者です。 ・長く使いたいため 新品 Windows11ノ 4 2022/04/05 23:12
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- その他(プログラミング・Web制作) Pythonのデータ型 2 2023/04/26 12:53
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- CPU・メモリ・マザーボード PCのメモリについて質問です 8 2022/10/04 09:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
エクセルのメモリ使用状況/Appl...
-
メモリのセグメント違反の解決...
-
malloc関数の使い終わった後の...
-
メモリが不足しています(VBA)
-
初心者過ぎる質問ですが、VRAM...
-
メモリ不足
-
【C言語】再帰が時間がかかる...
-
Bitmapを重ね合わせる方法
-
C言語初心者です。debug assert...
-
メモリの消費量について
-
closeとメモリの開放について
-
EXCEL-VBAにてADOのレコードセ...
-
C#におけるexeファイルのサイズ...
-
C/C++言語のメモリについて
-
動画再生アプリケーションに関して
-
「ヒープサイズの設定」て何?
-
エクセルVBA 大容量CSVファイル...
-
ExitProcessの関数コールについ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
【C言語】再帰が時間がかかる...
-
C言語における再帰呼び出しの...
-
メモリが不足しています(VBA)
-
メモリのセグメント違反の解決...
-
メモリ不足
-
エクセル キャッシュメモリー...
-
ファイルマッピング関数で失敗
-
動的メモリとexit(C言語)
-
エクセルVBA 大容量CSVファイル...
-
メモリの解放の仕方
-
「ヒープサイズの設定」て何?
-
EXCEL-VBAにてADOのレコードセ...
-
LoadLibraryしたらFreeLibrary
-
マインスイーパ、自動解析プロ...
-
バッチファイルでの実行EXEのメ...
-
C言語:関数のメモリ上でのサイ...
-
エクセルのメモリ使用状況/Appl...
-
大容量のメモリ確保をスワップ...
おすすめ情報