パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

バグチェックしてくれるCのクローン:Cyclone」記事へのコメント

  • ドキュメントをさらっと一読してみたけど、 この Cyclone というのは これは C@ の拡張に見えます。
    C@ というのは、 David Gay(Univ of California, Berkeley) という人が C に region というメモリ管理システムを 足したものです。 って、よく見ると cyclone のページは カルフォルニア大学じゃん。

    Cyclone は、 誤解をおそれずに言えばガベージコレクションが 入った C です。
    malloc することは出きるけど、free は禁止。 ガーベージになったら GC を起こして回収します。 ってやつです。

    あと Dynamic region という メモリ管理
    --
    コンタミは発見の母
    • by goodlife (5595) on 2001年11月20日 12時07分 (#39760) 日記
      なるほど,gc も dynamic region 機能もメチャメチャうれしい。 マルチスレッドで無造作にヒープを使っていると(特に C++)断片化が気になってしかたないので, めんどくせーと思いながら自分でこの dynamic region のようなものを用意していました。

      もし C++ に拡張できるのなら,理想のシステム開発言語だなあ。 …と思ってドキュメント見たら,「7 Polymorphism」という節がある。おおっ,と期待して見たら中身は1行で 「Use `a instead of void *.」--がっかり。

      親コメント
      • by yt (2748) on 2001年11月20日 15時17分 (#39853)

        「7 Polymorphism」という節がある。おおっ,と期待して見たら
        中身は1行で 「Use `a instead of void *.」--がっかり。


        Cyclone の Polymorphism は, O'Caml [ocaml.org] などの
        ML(Meta Language) で使われている方の意味ですね.

        ドキュメントにもありますが [cornell.edu], ML の Polymorphism は
        感覚的には C++ のテンプレートに近いです.
        引数の型を特定せずに関数を定義することができます.

        C に ML の機能がのったら超便利だなぁっておもってたところ
        なので, かなり興味深々になってます.
        親コメント
        • by yt (2748) on 2001年11月20日 15時27分 (#39862)
          自己フォローですが,
          マニュアルを読んでみると subtype [cornell.edu] という C++ のクラス
          みたいなのを定義できるみたいですね.
          親コメント
          • by goodlife (5595) on 2001年11月20日 16時50分 (#39889) 日記
            (同マニュアルより)将来の拡張の見込みとして,「e.g., subtyping on function pointers, bounded subtyping, etc.」なんて書いてありますねえ。

            関数ポインタは非常に C++ っぽいですね。そこまでしても,C++ の class にはしないのか。この人たち、C++ が嫌いなのかもしれない(笑)。

            後者は部分範囲型でしょうかね(Pascalとかの)。

            親コメント
        • by Anonymous Coward
          > 興味深々
          「興味津々」ね。

      • マルチスレッドで無造作にヒープを使っていると(特に C++)断片化が気になってしかたないので,めんどくせーと思いながら自分でこの dynamic region のようなものを用意していました。


        御意
        必要なメモリをスレッド開始時にがっと取れるようなアルゴリズムだといいけど、実行中にちょびちょびメモリを確保しなければいけないアルゴリズムでは malloc / new は駄目ですね。
        断片化が進むとコヒーレンス性のキャッシュミスが多発するので、性能が甚だしく低下します。
        このような場合、マルチスレッドで書くよりマルチプロセスでプログラムを書いて必要なところだけ共有メモリで共有した方が速くなることも多いです。

        完全な与太話ですが、
        C++ を使う時に自前でメモリ管理をする根性があれば、Thread Local Strage(TLS) と組み合わせた面白いメモリ管理テクニックがあります。
        概略だけ示すと、、、

        プログラムの先頭で

        DWORD dwThreadLocalHeap = TlsAlloc();

        とやっておいてから、各スレッドの頭でスレッド専用のメモリをぶん取って TLS に登録します。

        char* thread_local_heap = new char[いっぱい];
        TlsSetValue( dwThreadLocalHeap, thread_local_heap );

        でもって、以下のようなクラスを用意します。

        class CThreadLocalObj {
          public:
            void* operator new(size_t size);
            void operator delete(void* p);
            void* new_array(size_t size);
        };

        void* CThreadLocalObj::operator new(size_t size) {
            char* thread_local_heap = TlsGetValue( dwThreadLocalHeap );
            // thread_local_heap は最初に取ったスレッド専用なメモリなのでここを切り分ける。
        };

        ユーザーは CThreadLocalObj を派生して、

        class CMyObj : public CThreadLocalObj {
            // ...
        };

        CMyObj obj = new CMyObj(); // スレッドローカルな領域に確保される。

        という寸法です。
        --
        コンタミは発見の母
        親コメント

UNIXはただ死んだだけでなく、本当にひどい臭いを放ち始めている -- あるソフトウェアエンジニア

処理中...