割とたいそうな題名を付けたつもりです。でも、そんな大それたことを言うつもりはないです。

先週土曜の某問い詰める会でも少し話したのですが、現行のC++でこういう風にガベージコレクション(GC)を使うことを試してみたいと前々から考えています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void* operator new(std::size_t x)
{
    // 面倒なのでset_new_handler非対応
    if (void* p = GC_malloc(x)) // Boehm GCなど
    {
        return p;
    }
    else
    {
        throw std::bad_alloc();
    }
}
 
void operator delete(void* p)
{
} // 何もしない
 
// operator new[]とoperator delete[]も同様に定義する

メモリ管理だけGCを用い、デストラクタなどそれ以外のセマンティクスは今までの通りです。今までのC++コードがそのまま使える(導入が容易)という特長の一方、shared_ptrなどGCに頼るなら要らないはずのコードがそのままオーバーヘッドになってしまう(メモリ以外のリソース管理がある場合を除く)ことが大きな欠点になると考えています。

もちろん保守的GCしか使えないと思います。この案においては、世代別GCなどオブジェクトの移動を伴うGCの利用を考えていません。

そのうち、適当なプログラムで試してみたいところです。

スポンサード リンク

この記事のカテゴリ