2012-01-30 15 views
3

予測できない方法で実行時にサイズを変更する動的に割り当てられたバッファ(ベクトルや文字列など)を使用する場合、その割り当てを最適化する1つの方法は、 2(またはその他の境界/しきい値のセット)を使用し、余分なスペースを使用しないでください。これは、新しい空きメモリを検索し、データをコピーするコストを償却するのに役立ちますが、わずかなメモリ使用量を犠牲にします。例えば、多くのC++ stlコンテナのインタフェース仕様(reserve vs resize vs trim)は、このような仕組みを念頭に置いています。malloc/realloc /空き容量の最適化

私の質問は、Linux 3.0 x86_64、GLIBC 2.13、GCC 4.6(Ubuntu 11.10)のmalloc/realloc/freeメモリマネージャーのデフォルトの実装は最適化されていますか?

void* p = malloc(N); 
... // time passes, stuff happens 
void* q = realloc(p,M); 

別の言い方をすれば、NとMの値(または他の状況で)はp == qとなるでしょうか?

答えて

3

http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=12d2211b0d6603ac27840d6f629071d1c78586fe;hb=HEAD

最初はglibcのトランク内のrealloc実装から、メモリは(mmapを介して取得された場合)()、、 > =デフォルトで128KB IIRC:


    if (chunk_is_mmapped(oldp)) 
    { 
    void* newmem; 

#if HAVE_MREMAP 
    newp = mremap_chunk(oldp, nb); 
    if(newp) return chunk2mem(newp); 
#endif 
    /* Note the extra SIZE_SZ overhead. */ 
    if(oldsize - SIZE_SZ >= nb) return oldmem; /* do nothing */ 
    /* Must alloc, copy, free. */ 
    newmem = public_mALLOc(bytes); 
    if (newmem == 0) return 0; /* propagate failure */ 
    MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ); 
    munmap_chunk(oldp); 
    return newmem; 
    } 

(Linuxにはmremap()がありますので、実際にこれが行われます)。小さい要求の場合

、我々下の数行は_int_reallocをコピー&ペーストして、ここで少し大きいですが、あなたはそれが上記のリンクにライン4221で始まる見つける

newp = _int_realloc(ar_ptr, oldp, oldsize, nb); 

を持っています。 AFAICS、それは一定の因子最適化を行わない。 C++のstd :: vectorはそうですが、ユーザーが要求した量を正確に割り当てます(次のチャンク境界+アライメントなどに丸められます)。

ユーザーがこの2倍のサイズの増加(または複数回のサイズ変更時に対数効率を保証するために他の一定の係数の増加)を望む場合、ユーザーは自分自身をCライブラリによって提供される機能。

0

おそらくmalloc_usable_sizegoogle for it)を使用して、実験的に答えを見つけることができます。しかし、この関数は文書化されていないようですので、あなたのプラットフォームで利用可能かどうかチェックする必要があります。 glibcのmalloc関数は、大規模な要求のためにする代わりに、sbrkのの

も参照してくださいHow to find how much space is allocated by a call to malloc()?

関連する問題