アカウント名:
パスワード:
もし C++ に拡張できるのなら,理
マルチスレッドで無造作にヒープを使っていると(特に 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 という メモリ管理
コンタミは発見の母
Re:Region-based C (スコア:1)
もし C++ に拡張できるのなら,理
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(); // スレッドローカルな領域に確保される。
という寸法です。
コンタミは発見の母