2014-02-12-01-Cでmallocの回数を節約する話 - project-enigma

2014-02-12-01-Cでmallocの回数を節約する話

>> Site top >> weblog >> 月別アーカイブ >> 2014年02月のlog >> 2014-02-12-01-Cでmallocの回数を節約する話

最終更新日付:2014/02/12 23:50:00


Cでmallocの回数を節約する話

2014 年 02 月 12 日

何の本で読んだか忘れてしまったのだけれど、「長さ1の char 配列を使って、malloc の呼び出しを節約する」というテクニックがあった。久し振りに思い出したので、今日はそれについて書こう。最初のコードはこんな感じ。

typedef struct {
    int  size;
    char buf[1];
} foo;


foo* create_foo( const char* p );

int main( void ) {
    foo* pFoo = create_foo( "hello world" );
    puts( pFoo->buf );
    free( pFoo );
    return 0;
}

平たく言えば、構造体内部に可変長の文字列が1つだけある場合に、それを「長さ1の char 配列にして構造体の最後に配置する」ことで、malloc を1回で済ませようということだ。malloc する際には構造体のサイズと文字列の長さを足し合わせた長さを指定すれば、構造体の後ろに文字列分のメモリ領域が確保できる(そして元々の配列の長さ1は NULL 終端文字を格納するのに使える)というわけだ。具体的なコードは以下のとおり。

foo* create_foo( const char* p ) {
    foo* pFoo = 0;
    size_t len = strlen( p );
    pFoo = (foo*)malloc( sizeof(foo) + len );
    if( !pFoo )
        return 0;
    pFoo->size = len;
    strcpy( pFoo->buf, p );
    return pFoo;
}

C++ じゃなくて C を使う、というのはあまりないけれど、某独立行政法人での仕事はまさにそうだった。あの頃はこのテクニックを多用したように思う。まぁそれも他に開発要員がいなかったから好きにやれたというのが大きかったわけだけれど。

そういう意味では、他にもちょっと効果的でかつ結構面白い、というテクニックはいくつか覚えている。この weblog の埋め草にはいいだろう。時々書くことにしようか。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : C/C++

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.