0

シリアル化システムの場合、データを書き込むためのバッファーを割り当てる必要があります。必要なサイズは事前にわからないため、基本的なパターンはmalloc Nバイトでrealloc、さらに必要な場合に使用します。のサイズはN、ほとんどのオブジェクトを収容するのに十分な大きさであるため、再割り当てはほとんど行われません。

mallocこれにより、他よりも簡単に満たすことができる最適な初期バイト量がおそらくあると思いました。に近い場所だと思いますが、ハウスキーピングのためのスペースが必要かpagesizeどうかは必ずしも正確ではありません。malloc

さて、これは役に立たない最適化であると確信しています。それが本当に重要な場合は、プールを使用できますが、興味があります。start として割り当てるのが最も簡単なバイトのチャンクを教えてくれると考えるプログラマーは私が初めてではありません。これを判別する方法はありますか?

最新の GCC/G++ および/または Linux に特に適用されるこれに対する回答はすべて受け入れられます。

4

3 に答える 3

2

このwiki ページを読むと、使用している malloc の実装と OS によって答えが大きく変わるようです。OpenBSD の malloc のビットを読むのは特に興味深いものです。mmap も見たいようですが、デフォルトのページサイズ (4096?) を割り当てることが最適化されると思います。

于 2011-04-07T01:16:45.963 に答える
1

私の提案は、適切なmalloc / realloc / freeソースコードを見つけて、同じソースモジュール内で(同じメモリ構造を使用して)他のものと一緒に独自の「malloc_first」を実装できるようにすることです。渡されたminimum_bytesパラメーター以上の使用可能なブロック。0が渡されると、最初のブロック期間が取得されます。

適切な宣言は次のようになります

void *malloc_first (size_t minimum_bytes, size_t *actual_bytes);

そのような事業がどれほど実行可能かはわかりません。すべてのソースコードが利用可能なLinuxを使用して試してみることをお勧めします。

于 2011-04-25T15:29:43.097 に答える
-1

同様のケースで行われる方法は、最初mallocに重要ではあるが大きすぎないチャンクを割り当て、(説明したように) ほとんどのケースに適合し、その後のすべてのrealloc呼び出しで要求されたサイズを 2 倍にすることです。

したがって、最初に 100 を割り当てた場合、次回はrealloc200、次に 400、800 などと割り当てます。このようにして、再割り当てを行うたびに、その後の再割り当ての可能性が低くなります。

メモリが正しく機能する場合、それがstd::vector動作する方法です。

編集後

最適な初期割り当てサイズは、片側でほとんどのケースをカバーするサイズですが、反対側では無駄になりません。平均ケースが 50 であるが、500 に急増する可能性がある場合、最初に 50 を割り当て、次に 2 倍または 3 倍 (または 10 倍) して、1 ~ 3秒でrealloc500 に到達できるようにします。reallocさらにreallocs が発生する可能性は低く、まれです。したがって、基本的には使用パターンに依存します。

于 2011-04-07T01:13:37.637 に答える