- ベストアンサー
メモリーの確保について
皆さんはプログラムをするときに入力に応じて配列の大きさが変わるような場合には下記の方法のどれでプログラムしますか?こうすべきなのがベストだ!みないなお考えを聞かせてください。 (1)char str[100]のように大きなサイズを前もって用意しておく。これだとあとからデバック時に100って何か意味があるのかとか悩んでしまったりすると思います。 (2)malloc()とfree()関数を使って動的にメモリーを確保する (3)ポインタ配列を使う。char *strとか。 (4)その他 ご教授をよろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
用途によります。 例えばエディトボックス等で入力が100文字が上限なら char str[101]で事足ります。しかしその辺はどんぶり勘定で 128とかで良いかと思います。 スペックにもよりますが今のPCだと27バイトの隙間なんて どうでも良い話です。 malloc,freeが良いかというと、それは環境によります。 malloc,freeを繰り返すとメモリが断片化するので メモリの少ないコンシュマーゲームの開発などではあまり使いません。 ポインタ配列も同じです。 VC++ならCStringクラス、STL(C++)ならstringやwide文字に対応した wstringといったテンプレートが用意されています。
その他の回答 (4)
- terra5
- ベストアンサー率34% (574/1662)
既に回答にあるようにケースバイケースですから、ベストの方法は無いと言えます。 データの内容,処理速度,メモリ容量,作成にどれぐらい手間をかけるか,データサイズ、スタックサイズ、使われる場所(?)等で変えます。 勿論,(1)のケースでは#defineなりconstなり使いますが。 後は,内容によってはデータ構造として配列以外を使うこともあります。 リスト、スタック、リングバッファ・・・。
お礼
回答ありがとうございました。 やはり状況によって使い分けるのですね。 メモリマップの話はあまり理解していないのですが、今度じっくり勉強してみようと思います。 ちなみに私はC言語のスキルはひよっこレベルなのでまだまだ皆さんに比べるとわからないことが多いのですが、constは実引数を変更したくない時に使うものだと思っていたのですが、それ以外に使い道があるということですか?調べてみようと思います。リストやスタックなども使えるように勉強していきたいと思います。 どうもありがとうございました。
- sisya
- ベストアンサー率39% (97/244)
ゲームなどのメモリを確保する時間もなるべく短縮したい場合は、 その変数に使用するであろう最大のサイズを「define」で宣言し、 宣言時に数字直打ちにならないようにしています。 ex) cher srt[MAX_LENGTH]; 確保に要する時間は気にしないと言う場合は、 (2)の手段で領域を確保します。
お礼
回答ありがとうございます。 メモリーの確保時間が(1)の方が早いとはためになりました。 何を開発するかをひっくるめて状況によるのですね。 どうも貴重な情報をありがとうございました。
- gentaro
- ベストアンサー率47% (105/221)
最近はPHPばかりでメモリ領域確保なんてとんと忘れていました(笑)。 私の場合、1次元配列ただ1個なら(1)が多いですね。#1の方と同じようにソースの頭やヘッダで定義しますけど。 多次元配列や構造体配列なんかのときで数が不定なら迷わず(2)です。(3)にしても実エリアは領域確保しなきゃなりませんし。
お礼
回答ありがとうございます。 phpはほんのちょっとだけかじったことがあるのですが、メモリ確保がいらないとは初耳でした。多次元もしくは構造体配列のときならmallocなどを使うですか...参考になります。 どうもありがとうございました。
- mitoneko
- ベストアンサー率58% (469/798)
Cで作成するときには、2と3ですね。この二つ、本質的には、同じかな・・・malloc freeで動的メモリーを確保し、それをポインターを経由して利用する。(目的に応じては、char **str とポインターの配列になるときもありますが・・・) ただ、小さい関数で、最大のデータサイズが何らかの方法で確定できるときは、1の方法も使います。入力関数のデータバッファ等ですね。 この手を使う場合は、#define MaxNanchara 100のように記号化した上で、何チャラの部分に大きさを確定した理由を推測できる言葉を選んでます。 この場合も、処理後には、結局動的メモリーにうつすことになりますけど。 ちなみに、C++でしたら、メモリー管理をさぼるために、stringクラスや、vectorクラスで対応することが圧倒的に多いです。なにせ、これが一番楽ですから(苦笑)
お礼
回答ありがとうございます。そうですね2と3は本質的には同じでした。確定できる時には#defineで明示するのがやはり通説ですね。 C++はわからないのですが、これからCをある程度つかいこなせるようになったら勉強してみたいと思います。stringクラス、vectorクラスは覚えておこうと思います。ちなみに最近ではどの会社もオブジェクト指向言語を使うのですかね?ゲーム会社だとc++が多くて、ネットワーク系の会社だとjavaが多いとかのように私は思っているのですが。
お礼
回答ありがとうございます。 malloc,freeを繰り返すとメモリが断片化するのは知りませんでした。ゲーム開発ではあまり使わないとは非常に貴重な情報ありがとうございます。c++はわからないのですが、Cが使いこなせるようになったらチャレンジしてみようと思います。どうもありがとうございました。