アカウント名:
パスワード:
って、よく見ると cyclone のページはカルフォルニア大学じゃん。
もし C++ に拡張できるのなら,理想のシステム開発言語だなあ。 …と思ってドキュメント見たら,「7 Polymorphism」という節がある。おおっ,と期待して見たら中身は1行で 「Use `a instead of void *.」--がっかり。
「7 Polymorphism」という節がある。おおっ,と期待して見たら 中身は1行で 「Use `a instead of void *.」--がっかり。
関数ポインタは非常に C++ っぽいですね。そこまでしても,C++ の class にはしないのか。この人たち、C++ が嫌いなのかもしれない(笑)。
後者は部分範囲型でしょうかね(Pascalとかの)。
マルチスレッドで無造作にヒープを使っていると(特に C++)断片化が気になってしかたないので,めんどくせーと思いながら自分でこの dynamic region のようなものを用意していました。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲは一日にしてならず -- アレゲ研究家
Region-based C (スコア:2, 興味深い)
C@ というのは、 David Gay(Univ of California, Berkeley) という人が C に region というメモリ管理システムを 足したものです。 って、よく見ると cyclone のページは カルフォルニア大学じゃん。
Cyclone は、 誤解をおそれずに言えばガベージコレクションが 入った C です。
malloc することは出きるけど、free は禁止。 ガーベージになったら GC を起こして回収します。 ってやつです。
あと Dynamic region という メモリ管理システムが 入っています。
これも誤解を恐れずにいうと、 ヒープからオブジェクトを 直接取ると 色々面倒です。 そこで、 ヒープから まずリージョンを取ってきて、 その中からオブジェクトを 小出しに取ってきます。 オブジェクトを解放する時には リージョンごと全部 解放してしまおうというアイデアです。
リージョンの取り方、解放の仕方は プログラマが決めるので、 メモリ管理が 賢くなりますし、 GCを使って回収するより高速です。
でも、 反射的に「この言語でまともなマルチスレッドプログラムは 書けるの?」という疑問が浮かぶのですが、、、
コンタミは発見の母
Re:Region-based C (スコア:1)
コンタミは発見の母
Re:Region-based C (スコア:1)
もし C++ に拡張できるのなら,理想のシステム開発言語だなあ。 …と思ってドキュメント見たら,「7 Polymorphism」という節がある。おおっ,と期待して見たら中身は1行で 「Use `a instead of void *.」--がっかり。
Polymorphism (スコア:1)
Cyclone の Polymorphism は, O'Caml [ocaml.org] などの
ML(Meta Language) で使われている方の意味ですね.
ドキュメントにもありますが [cornell.edu], ML の Polymorphism は
感覚的には C++ のテンプレートに近いです.
引数の型を特定せずに関数を定義することができます.
C に ML の機能がのったら超便利だなぁっておもってたところ
なので, かなり興味深々になってます.
Re:Polymorphism (スコア:1)
マニュアルを読んでみると subtype [cornell.edu] という C++ のクラス
みたいなのを定義できるみたいですね.
Re:Polymorphism (スコア:1)
関数ポインタは非常に C++ っぽいですね。そこまでしても,C++ の class にはしないのか。この人たち、C++ が嫌いなのかもしれない(笑)。
後者は部分範囲型でしょうかね(Pascalとかの)。
Re:Polymorphism (スコア:0)
「興味津々」ね。
TLS を使ったスレッドローカルヒープオブジェクト (スコア:1)
御意
必要なメモリをスレッド開始時にがっと取れるようなアルゴリズムだといいけど、実行中にちょびちょびメモリを確保しなければいけないアルゴリズムでは 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(); // スレッドローカルな領域に確保される。
という寸法です。
コンタミは発見の母