メモリを2の累乗で割り当てる方が良いでしょうか? 質問する

メモリを2の累乗で割り当てる方が良いでしょうか? 質問する

メモリを割り当てるときにmalloc()、2の累乗のサイズを指定するべきでしょうか?それとも必要なサイズだけを指定するべきでしょうか

//char *ptr= malloc( 200 ); 
char *ptr= malloc( 256 );//instead of 200 we use 256

2 の累乗のサイズを指定する方がよい場合、その理由は何ですか? なぜそれがよいのでしょうか?

ありがとう

編集

私が混乱している理由は、ジョエルのブログからの次の引用です。基本に立ち返って

賢いプログラマーは、常に 2 の累乗のサイズのメモリ ブロックを割り当てることで、malloc による潜在的な中断を最小限に抑えます。4 バイト、8 バイト、16 バイト、18446744073709551616 バイトなどです。レゴで遊ぶ人なら誰でも直感的にわかるはずですが、これにより、フリー チェーンで発生する奇妙な断片化の量が最小限に抑えられます。スペースを無駄にしているように見えるかもしれませんが、スペースの 50% 以上が無駄になることは決してないことも簡単にわかります。そのため、プログラムが使用するメモリは必要なメモリの 2 倍以下であり、それほど大きな問題ではありません。

申し訳ありませんが、上記の引用をもっと早く投稿すべきでした。お詫び申し上げます。

これまでのほとんどの返信では、2 の累乗でメモリを割り当てるのは悪い考えだと言っていますが、ではどのシナリオで Joel の指摘に従うのが良いのでしょうかmalloc()? 彼はなぜそう言ったのでしょうか? 上記の提案は今では時代遅れなのでしょうか?

わかりやすく説明してください。
ありがとうございます

ベストアンサー1

必要なサイズを正確に指定してください。2 の累乗サイズが「より良い」唯一の理由は、割り当てを高速化したり、メモリの断片化を回避したりできるためです。

ただし、効率性を重視する重要なmalloc実装では、適切な場合には、内部的にこの方法で割り当てを切り上げます。 malloc を「支援」する必要はありません。 malloc は単独でも十分に機能します。

編集:

Joel on Softwareの記事の引用に対する返答ですが、そのセクションでのJoelの主張は(引用した段落に続く文脈がなければ正確には理解しにくいのですが)、頻繁に- バッファを割り当てる場合は、加算的ではなく乗算的に行う方が適切です。実際、これはC++ のstd::stringおよびstd::vectorクラス (その他) が行うこととまったく同じです。

これが改善である理由は、malloc便利な数字を提供することで助けになるのではなく、メモリ割り当てが高い操作を繰り返す回数を最小限に抑えようとしています。ジョエルは時間と空間のトレードオフの考え方の具体的な例を示しています。必要なメモリの量が動的に変化する多くのケースでは、拡張ごとに必要な量の2倍まで割り当てることで、ある程度のスペースを無駄にし、メモリを節約する方がよいと主張しています。時間nより多くのバイトが必要になるたびに、正確にバイトのメモリを繰り返し追加する必要がありますn

乗数は 2 である必要はありません。必要なスペースの最大 3 倍を割り当てて 3 の累乗の割り当てにしたり、必要なスペースの最大 57 倍を割り当てて 57 の累乗の割り当てにしたりできます。割り当てを多くすればするほど、再割り当ての頻度は減りますが、無駄になるメモリは多くなります。必要なメモリの最大 2 倍を使用する 2 の累乗の割り当ては、必要なメモリが正確に何であるかをよりよく理解するまでは、良い出発点のトレードオフになります。

彼は、これが「フリー チェーンの断片化」を減らすのに役立つとついでに述べていますが、その理由は、割り当ての正確なサイズではなく、実行される割り当ての数と均一性によるものです。まず、メモリの割り当てと割り当て解除の回数が増えるほど、割り当てるサイズに関係なく、ヒープが断片化される可能性が高くなります。次に、同じ乗法サイズ変更アルゴリズムを使用して動的にサイズ変更するバッファーが複数ある場合、1 つを 32 から 64 にサイズ変更し、もう 1 つを 16 から 32 にサイズ変更すると、2 つ目以降の再割り当てが最初のバッファーがあった場所に収まる可能性があります。1 つを 25 から 60 にサイズ変更し、もう 1 つを 16 から 26 にサイズ変更した場合は、この状況は発生しません。

繰り返しますが、割り当て手順を 1 回だけ実行する場合には、彼が説明していることはどれも当てはまりません。

おすすめ記事