- ベストアンサー
動的なメモリ確保の仕方
- ユーザーが入力した任意個数のデータを受け取り、平均や標準偏差を求めるプログラムを作成するための、効率的なメモリ確保方法を探しています。
- 現在考えられる方法として、あらかじめ限界サイズの配列を用意する方法と、ポインタとmalloc関数を使用して動的にデータ領域を確保する方法がありますが、いずれも効率的ではないと感じています。
- 効率的なメモリ確保方法について情報がなかなか見つからないため、良い方法をご存じの方は教えていただきたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
例えば以下のような構造体を用意します。 { 1000個のデータ用配列 データ有効数(0-1000) 1000個埋まった時の次の構造体アドレス } 入力データが1000増える毎に、構造体1つ分をmalloc()してチェーン状に繋げれば、程々のメモリ効率が実現できます。 適当に1000という値で説明しましたが、調整すればそこそこ使えると思います。
その他の回答 (4)
- don_go
- ベストアンサー率31% (336/1059)
>「入力されたデータをメモリ容量限界まで >保存可能にする。」 >なかなかそれという情報にネットで出会え >ていない状態です。 それをしてしまうと、プログラムがデータを 処理する為の作業領域用のメモリも無くなる のでプログラムとしては意味の無い物になる だけだからです。
- aozakana_dha
- ベストアンサー率45% (76/168)
realloc で必要な分だけ領域を広げれば次データ用のポインタは不要になりますが、 次データのポインタを使う方式はデータが連続している必要がないのに対して 次データのポインタを使わない方式では全データが連続している必要があるので、 少ないメモリを効率的に使う場合には必ずしも有効ではありません。 C++ と 標準テンプレートライブラリ(STL) が使える環境であれば vector や list 等のコンテナが使えますから、 自作せずにそれらを使うのが良いかと思います。
お礼
ご回答いただき、ありがとうございました。 説明不足で申し訳ありませんが、C言語限定のつもりでした。 reallocをする方法は考えておりませんでした。 ただこの方法の場合、その他の処理によって [--既確保分--][何か別の処理用] とたまたまなってしまうと、メモリ容量限界に関わらず、 「連続した領域は確保できなかった」ということで、 NULL返しになってしまわないでしょうか? >C++ と 標準テンプレートライブラリ(STL) が使える環境であれば >vector や list 等のコンテナが使えますから、 >自作せずにそれらを使うのが良いかと思います。 今回は仕組みを学ぶことを目的としていましたので、 コンテナの利用は控えたいと思います。
- don_go
- ベストアンサー率31% (336/1059)
0x7FFFFFFF=2,147,483,647 >ユーザーが入力した任意個数 21億件のデータを1人で入力しようとすれば 日が暮れても終わりません。 複数の人を使って入力を行い、ファイル又は データベース渡しで受け取ったデータを使う のをお薦めします。 その場合、メモリ上に配列を持つ必要はあり ません。
補足
ご回答ありがとうございます。 >複数の人を使って入力を行い、ファイル又は >データベース渡しで受け取ったデータを使う >のをお薦めします。 おっしゃることはごもっともですが、 データ構造・管理に関する設計上の問題はとりあえず棚上げし、 「入力されたデータをメモリ容量限界まで保存可能にする。」 ということについて、どういう実現方法があるのかを検討しておりました。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
残念ながら「ありません」 メモリ内に確保できないほどになったらDatabaseにぶち込みますし。
お礼
ご回答ありがとうございます。 >メモリ内に確保できないほどになったらDatabaseにぶち込みますし。 はい、通常それが当然の方法かと思います。 「残念ながら「ありません」」なことは、本当に残念ですが、 あきらめがつきました。
お礼
ご回答ありがとうございます。 ご提案いただいた方法は、 ■既に検討中の方法に対して、技術的追加要素がほぼ無く、 ■ただn個の配列にするだけで、メモリ使用における ポインタ情報の比率をn分の1にできる(効果を得やすい!) の2点で優れていると感じました。 使わせていただきたいと思います。