- ベストアンサー
グローバル変数のサイズ
C言語でWindowsのプログラムを作成しようとしています。(初心者) Windows のプログラムでは、グローバル変数は最大どれくらい確保できるものなのでしょうか? また、グローバル変数を多く取りすぎると、OSへ影響が出るのでしょうか? 下記の変数を確保使用としています。 char Data[1000][4096]; よろしくお願いいたします。
- みんなの回答 (14)
- 専門家の回答
質問者が選んだベストアンサー
> 私は、組込みは少し経験があったのですが、 > Windowsプログラムは経験がなくメモリの扱い方や > 制限が気になっていました。 組み込みシステムとは違って、PCのプログラムは「富豪的プログラミング」なんてのがあるぐらいなので、メモリはそれほど気にしなくてもいいです。 わたしは個人的には富豪的プログラミングには全面的に賛同できないんですが… 富豪的プログラミングについては以下 http://pitecan.com/fugo.html エコプログラミングなるものを提唱しているひとも。 http://nais.to/~yto/doc/zb/0017.html > 私としては、メモリ確保のオーバヘッドや初期化処理等に > 時間がかかるのかなとか、なんらかのデータ構造の > アルゴリズムをした際の検索に時間がかかるのかなとか > 思っていました。 オーバヘッドや初期化処理は静的に確保しても対して変わりません。プログラムのロード時に実際のところ初期化するのですから。staticに確保すると通常は0で埋められますが、プログラムをロードする際に0でクリアしています。それをプログラムで明示的に行うだけですし、現在のPC用のOSはメモリを確保しても初期化したり、データを入れるまでは実際にはメモリを割り付けていないケースが多いです。 # ディスクからデータを読み込む場合、オンデマンドで # 割り付けてもディスクI/Oの待ち時間に十分処理できたり。
その他の回答 (13)
- jacta
- ベストアンサー率26% (845/3158)
>『確実に保証される』とはどのようなことなのでしょうか?32767バイト以降は、処理中に破壊されてしまうのでしょうか? 標準Cの規格では、(正常に)コンパイル・実行できなければならない最低限の要件が「翻訳限界」として規定されています。その中に、1個のオブジェクトのバイト数として32767バイトが挙げられています。 ただし、これは最低限の要件なので、こうした制約がない方が望ましいともされています。しかし、32767バイトを超えるオブジェクトを宣言した場合、コンパイルできなかったり、実行時に誤動作しても致し方ありません。具体的にどんな振る舞いになるかはわかりません。
- jacta
- ベストアンサー率26% (845/3158)
> Windows のプログラムでは、グローバル変数は最大どれくらい確保できるものなのでしょうか? Windowsというよりは、コンパイラに依存します。 コンパイラに関係なく(といっても非標準処理系は除く)確実に保証されるのは、一つのオブジェクトあたり32767バイトまでです。
補足
回答ありがとうございました。 >コンパイラに関係なく(といっても非標準処理系は除く)確実に保証されるのは、 とありますが、『確実に保証される』とはどのようなことなのでしょうか?32767バイト以降は、処理中に破壊されてしまうのでしょうか?
- suzukika
- ベストアンサー率28% (8/28)
こんにちは まず、グローバル変数はなるべく使用しないほうがいいです。使用しざるを得ないときのみ使ってください。 多く使うとき、メモリの占用は多くなるし、プログラム終了までずっと独占されるわけです。 それから char Data[1000][4096]; という定義のやり方はあまり薦めしません。 それは非常に大きい値であり、普通のやり方はポインタを使用し、最初適当にメモリを確保し(malloc)、あとは足りないとき動的に確保メモリサイズを変更する(realloc)のです。 mallocなどでメモリを確保し使い終わったらfree関数で解放することも忘れないように。 最大どのぐらい確保できるかという質問されると・・その方向であまり考えないようにしましょう。最小どのぐらいメモリの確保が必要なのかを自分に質問しましょう^^
補足
回答ありがとうございました。もう少し質問させてください。 『char Data[1000][4096];』を使用しインデックスで、読出し,書込みを高速に行おうとしています。このような使い方の場合、mallocを使用すると、検索に時間がかかってしまいそうな気がしますが、いい方法はないでしょうか?
- 1
- 2
お礼
いろいろ詳しく教えていただきありがとうございました。 教えていただいたURLで、もう少し勉強していこうと思います。