reallocの存在意義
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
NGNGreallocだけ存在意義がわかりません。
mallocとfreeだけでもほとんどことたります。
callocもあってもいいかなとは思います。
(配列は一般にサイズが大きくなるから別管理したほうが効率が可能性もあるし)
reallocは移動することもあるししないこともある、というのが使いにくくてしょうがないです。
いったい、reallocが存在するとどんなメリットがあるのでしょう?
0002名無しさん@お腹いっぱい。
NGNG0003名無しさん@お腹いっぱい。
NGNGfreeして、mallocするのに比べて効率がいいんですか?
freeしてサイズを変えてmallocするなんて、効率が悪いから普通はしないと思うのですが。
0004( ´∀`)さん
NGNGだからreallocがあるんだろうが。
0005名無しさん@お腹いっぱい。
NGNG0006名無しさん@お腹いっぱい。
NGNGreallocが効率よく機能する場面てあるんですか?
0007名無しさん@お腹いっぱい。
NGNG便利なので必要だと思います。
malloc、freeだと
*新たなサイズのメモリをmallocする。
*前のデータを新しいメモリにコピーする
*前のデータをfree
ということになって面倒だと思います。
0008名無しさん@お腹いっぱい。
NGNG>普通はそういう場合はリストを使うと思うんですが。
おまえ、一度リスト作ってみろよ。
00091
NGNG多少、大きくても普通は問題ない気がするんですが。
コピーを伴うような、再確保を頻繁に行うのはいい設計とはいえないですし...。
0010名無しさん@お腹いっぱい。
NGNGベンチマークしてみなよ。
たいていの環境でreallocのほうが速いから。
00111
NGNG普段は逐次的な読み込みなんかは、とりあえず、双方向リングかニ分木を使ってます。
アクセス性能が問題になって、個数の変化の少ないデータは、全体の数が確定した時点で、
大きな配列を確保して、そちらにコピーしてますが?なにか?
0012名無しさん@お腹いっぱい。
NGNGいちいちリスト使ってたらアクセス遅くていらいらしない?
&
リストは何度もmalloc呼ぶ羽目になるから重くなりがち、
使い所を考えないと自己満足で終わる。あんたは多分そういうタイプ。
0013名無しさん@お腹いっぱい。
NGNG00141
NGNGfreeしてmallocしなければならない場面が、そんなにないと思うんですが?
具体的にどんな処理をするときに有効ですか?
0015名無しさん@お腹いっぱい。
NGNGおまえ、煽り下手。
ネタのつもりだろうが、スレッドの最初っから、プンプン臭って
くるし、見ているこっちが恥ずかしくなるよ。
修行が足りんよ、出直しておいで。
0016宇津田志野
NGNG00171
NGNG普通はおおよそのまとまった個数のリスト要素の配列を確保するんじゃないんですか?
あと、逐次的な処理しているときは、リストで十分です。
ランダムアクセスしながら、逐次的にデータが増えるってそうそうない場面だと思います。
00181
NGNG本気で、reallocが何で必要なのかわかんないです。
reallocを多用することそのものが、設計の間違いだと思います。
0019名無しさん@お腹いっぱい。
NGNGだれが多用してるの?
0020名無しさん@お腹いっぱい。
NGNG>ないと思うのですが。
だからreallocがあるんだろうが。(4さんのこぴぺ)
>サイズを小さくしたいことってあるんですか?
あったらどうするんだよ
>個数の変化の少ないデータは、全体の数が確定した時点で、
個数変化の多い、全体の数を確定できないデータの場合は?
>ランダムアクセスしながら、逐次的にデータが増えるってそうそうな
>い場面だと思います。
だから、あったらどうするんだよ。
以上、答えは全て自分で答えております。
よってこのスレッド、終了。
00211
NGNG拡張できるところですよね。
問題は、大抵のプログラムでは、拡張する前に立て続けにmallocが呼ばれることが多いから、
結局拡張できない可能性があるわけで...。
どうしても、しょっちゅう拡張しなくちゃいけないようなものは、
最初から、多めに割り当てるか、16個とか32個ぐらいのブロックごとに
リンクでつなぐという選択肢が妥当だと思います。
0022名無しさん@お腹いっぱい。
NGNG本気でreallocいらないの?
vectorみたいな可変長配列欲しいと思ったことない?
0023名無しさん@お腹いっぱい。
NGNG可変長のデータを処理する時。
つーかそういうレベルで文句言うなら、callocだっていらないし、
ムダな関数は他にもたくさんある。
0024名無しさん@お腹いっぱい。
NGNGまた、現在確保されている領域の隣りにちょうど空きがあった場合、単に領域サイズを広げるのみで、内部でmalloc/freeに相当する処理を呼ぶ事が無いので、多少効率が良いかもしれません。
ただし、reallocは失敗時の振る舞いが処理系毎に異なっていて、問題が起った経験があるので、わたし自身、あまり使用していません。
あとは、malloc/free/realloc自体は遅い処理なので、効率を考えるならば、最初にメモリブロックを大きく取るなどの、他の方法を考えた方が良いです。
00251
NGNGという具体的な例をだしてほしいです。
あったらどうするか?で、
ライブラリは作られているわけではないですよね?
標準に選ばれたからには、なんらかの存在意義と、アプリケーションが想定されていたはずだと思うんです。
ランダムアクセスしながら、逐次的にデータが増えるというのは、
具体的にどんなアプリケーションが考えられますか?
0026名無しさん@お腹いっぱい。
NGNGもう、要らないでいいから、お前だけ一生realloc使うな。
じゃあね。
0027名無しさん@お腹いっぱい。
NGNG>1
そういうわけだからこれからはsageで書け。
0028名無しさん@お腹いっぱい。
NGNG0029名無しさん@お腹いっぱい。
NGNG「reallocを多用するのは設計の間違い」って前提が間違ってる。
世の中そんなガリガリに最適化が必要なアプリばかりじゃない。
0030名無しさん@お腹いっぱい。
NGNGむしろ、
int val1@` val2@` val3@` val4...;
みたいな(藁
0031名無しさん@お腹いっぱい。
NGNGreallocが在った方が良いか、無い方が良いか、という議論ならば、別に無くても良いですね。(笑)
25 > 文字列型を自分で作る場合とかで可変長配列は必要だと思いますけど。reallocしなければいけないわけじゃないけどね。
0032名無しさん@お腹いっぱい。
NGNG0033名無しさん@お腹いっぱい。
NGNG00341
NGNGどうもありがとうございます。
malloc -> freeだと"必ず"断片化が起こるという、ご指摘はなるほどと思いました。
たしかに大きな存在意義ですね。
>29
動けばいいなら、最初からメモリを多めに確保しておいて、たまに
malloc/freeしてもそんなに問題ないわけで、
ライブラリに用意されているということは多用する処理だからこそ、
なんだと思いますが?
0035名無しさん@お腹いっぱい。
NGNG議論自体が無意味な気がする・・・。
ところで1はどうした?
003635
NGNG00371
NGNG多いこともあるデータを、プログラム起動時にファイルから読み込む場合なんかは、
上限一杯で、mallocしておいて、ファイルの読み込みが終わったらreallocして
切り詰めるって使い方は意味がありそうですね。
00381
NGNG0039名無しさん@お腹いっぱい。
NGNG処理系がVisualC++やgccならランタイムのソースも見れると思いますよ。こーゆーのは自分で確認するのが一番だと思います。
reallocはメモリがシビアな環境(16bitのMSDOSとか)でもない限り、現在ではあまり意味は無いと思います。
0040名無しさん@お腹いっぱい。
NGNG最初から、なぜreallocが必要無いか書いとけよ。
つっこみがあってから反論してないでよ。
00411
NGNGお付き合いありがとうございます。
#こんなレスしかつかないなら、最初からソースみればよかったとおもいました。
実際のところ、あまり意味がないのかな。
C++のフリーストアにreallocに等価なものが定義されていないというのもその現れなのかなぁ。
00421
NGNG別に、必要無いという主張をしたくて、スレッドを立てたわけじゃなくて、
自分で考える限りほとんど必要性を感じないのに、なんでライブラリにあるのかなぁと。
標準ライブラリ関数に選ばれるからには、選ばれたときはなにかの理由があったはずです。
0043名無しさん@お腹いっぱい。
NGNGこいつ天然ですか?
0044名無しさん@お腹いっぱい。
NGNGホントに、夏休み以来どうしようも無いほどにレベルがさがったもんだ。
1もダメだよ。こんな板でマジメに聞いたら。
サル以下しかいないんだから。ケケケ。
0045>43
NGNG0046名無しさん@お腹いっぱい。
NGNGどう見てももがいてるのはチミだと思う。
0047名無しさん@お腹いっぱい。
NGNG0048名無しさん@お腹いっぱい。
NGNG「基本の話」だというのに、非常に恐縮だが、
なんで??
0049++
NGNG領域の拡張なんかする時
malloc() とfree()でやると
100の領域に10追加したいとき
・100+10 をまず確保して、
・元の100のデータをそこに移して
・元の100を解放する
って一連の操作がrealloc()
1つでできるからね
(例なんで、異常系の処理が抜けてるとかいわんでね・・)
0050>48
NGNG0051名無しさん@お腹いっぱい。
NGNGというかそれを皆、期待してるのかな?
浮いていたら詰めるような動作をさせれば、メモリフラグメントの解決に
使えるんじゃないかと。
0052名無しさん@お腹いっぱい。
NGNGバッファを切り詰めるのにreallocを使ったな。このときばかりは、reallocはありがたかった。
とりあえず最大メッセージ長でmallocしておいて、区切り文字がくるたびに、
reallocして切り詰めて返す。って処理ね。
しかし、今考えてみると、reallocって、切り詰めた場合、必ず同じ場所を返すことが保証されてる
のだろうか?
最近のメモリ豊富な状況を考えると、reallocってほとんど使い道ないね。
0053名無しさん@お腹いっぱい。
NGNGrealloc無しだと下のようになると思うけど...
めちゃくちゃ効率悪いね。
int foo(const char *str_to_add)
{
static char *psz = NULL;
char *psznew;
psznew = malloc(...);
if(psznew == NULL) return 0;
memcpy(...);
memcpy(...);
free(psz);
psz = psznew;
return 1;
}
0054>52
NGNG頻繁にalloc/freeするシステムでは、やがて フラグメンテーション
の為にメモリの利用効率が悪くなってゆく。
これが制御系でCが未だに主に使われ、C++が普及しない理由のひとつ
オブジェクトのメモリ割り当てをもう少し細かく制御出来る仕掛けが
必要なように思う
0055名無しさん@お腹いっぱい。
NGNGsize += XXX;
oldElemens = elements;
elements = (FOO **)realloc(elements@` sizeof(FOO *) * size);
if(elements == NULL){
XXXX;
}
}
elements[numElements ++] = newFoo;
0056名無しさん@お腹いっぱい。
NGNG何がいいたいのか解説しろよ。
0057名無しさん@お腹いっぱい。
NGNG何が言いたいのか判らないが、oldElemens が何処かに逝っちゃってる
0058名無しさん@お腹いっぱい。
NGNG>XXXX;
で使うんじゃない?
elementsの値を戻すとか。
でも、こんなコード書くより日本語で一言
「配列の拡大」って書いた方が早くない?
0059。>
NGNG仮想空間上で領域を再確保するなら、ページマッピングが変わるだけで、
領域コピーは発生しないから、効率よく拡張できるはずだけど。
そうなってないのか?
malloc+freeで擬似的に実現するのとは、違う動作を期待するが。
00601
NGNGHeapAlloc/HeapReAlloc/HeapFreeを呼んでるみたいです。
Heep系のAPIはページ単位で確保するわけでない(ですよね?)ので、
ページマッピングの移動だけというわけにはいかなそうな気がします。
GNUのライブラリはもうちょっと賢い実装してあるのかな。
今、手元にソースがないので今度みてみます。
0061。>60
NGNGページサイズ以上のヒープブロックであれば、ある程度、効率よく出来そうだけどね。
まぁ、少なくとも、malloc+freeとイコールではないでしょ。
この辺は、実装依存だから、なんとも言えませんが。
どっちにしろ、細かい単位で煩雑にヒープの確保、再確保、開放してると、
フラグメントも完全には避けられないし、パフォーマンスも悪いです。
まとめて確保して、うまく振り分けたほうが効率いいですな。
0062名無しさん@お腹いっぱい。
NGNGVC++5だか6だか辺りから「小ブロックヒープマネージャ」が入って
いた気がするが...
■ このスレッドは過去ログ倉庫に格納されています