BoehmGCとは?BoehmGCとはBoehm-Demers-Weiser conservative GCの通称です。いわいるガーベジコレクター機構を実現するためのライブラリでこの手のライブラリの中ではとても有名です。 簡単に言いますと、malloc()してもfree()しなくてよい!newしてもdeleteしなくてよい!といった感じです。 conservativeなので保守的なGCです。GC処理の方法にも様々な方法があるようですが、それは後述します。 このライブラリを発見した当初、私は大喜びしました。なぜならmallocした後のメモリリークチェックデバッグに時間を使わなくて済むと思ったからです。 ですが、これは幻想でした。(BoehmGCの弱点に続く・・・) BoehmGCの弱点http://d.hatena.ne.jp/yaneurao/20040410によると GCで確保したメモリ領域を全部たどって解放されていないメモリを調べていくので大きいメモリ領域を確保した場合、その処理にとても時間がかかるそうです。確かにこんなことされてはたまりません。 よって画像に使うメモリ等、数百キロバイトから数メガバイト単位のメモリを使う場合は素直にmalloc()free()を使うべきです。 ダウンロード先および準備A garbage collector for C and C++ の Where to get the collectorよりgc_source/.のリンク先をクリックして ダウンロードします。 私が今記事を書いている時点でgc6.8.tar.gzがリリースされています。 そしてアーカイブを解凍し使える状態にしてからinstallなりmakefileなりして使える状態にします。 VCで使う場合README.win32あたりを読み大体の憶測をつけてmakefileします。(大雑把ですが^^;) その中にNT_MAKEFILE,NT_STATIC_THREAD_MAKEFILE,NT_THREAD_MAKEFILEがあります。。 意味はそれぞれの名前の通りだと思います。ここではその詳細については割愛し、 早速使ってみたいと思います。 MakefileをMakefile.bakにリネーム。 NT_MAKEFILEをMAKEFILEにリネーム。 コマンドプロンプトでアーカイブを解凍したフォルダに行く。 (例:C:\gc6.8に解凍した場合はコマンドプロンプトを起動してcd c:\gc6.8を打ち込んだ後にc:を打ち込む) nmake nodebug=1 allを打ち込む。 そうすると自動でコンパイルしてくれます。 gc.libが生成される。 その後、テストをする為にgctest.exeと打ち込む。gc.logが出力される。 gc.logを覗いてみる。
以上です。 ライブラリの使い方gc.libをリンクし、gc.hをインクルードします。gc.hはincludeフォルダに入っています。主に以下の関数を使ってプログラミングします。
これでmalloc()free()の面倒な方法から解放され、 GC_malloc()のみを使ってプログラミングしていくことになります。 使い方のコツとしては細かなサイズのメモリ領域確保に使用することです。 サンプルプログラムいちいちBoehmGCをダウンロードしてきてmakeするのがめんどくさいという方に VCでコンパイルしたライブラリファイルおよびサンプルプログラム(boehmgcフォルダ)を用意しました。以下からダウンロードしてください。 DxLibFanで作ったサンプルプログラム集 以上。 小話実はBoehmの発音はどうなのだろうと考えていた時期がありました。高校生の時はボエホン(笑)(ドアホンかよ!)と心の中で読んでいましたが、最近はボーンって心の中で読んでいました・・・。 ですが、 http://d.hatena.ne.jp/textfile/20060808/boem によると、ボウムだったんですね。赤面モノです。 |
BoehmGCとは? BoehmGCとはメモリ管理ライブラリです。 メモリ管理ライブラリって何よ!? 具体的に言いますと、C言語ではメモリを確保するのにmalloc(またはcalloc,realloc等等) C++言語ではnewですね。(まぁmallocも使えないことは無いけど^^;) それらのメモリはfreeやdeleteしないとメモリリークというバグの原因になり、危険なんです。 なので高性能なメモリ管理機構が必要なわけで、(garbage collector (ガベージコレクタ(ガーベジコレクタ)) (直訳するとゴミマニア、またはゴミオタク(直訳合ってないよ) 使わないメモリを採集するらしい)) それらの管理方法はなんか大学レベルらしいです^^; d金魚はヴぁかだからわからないですが^^;m(*- -*)mス・スイマセーン。 でも、このBoehmGCを使うとほんとに楽なんですよ!!マズィで! なんと!freeを呼び出さなくて良いんです! 詳しくは以下で検索してみてくれ。 BehonGCの奨励情報 Boehm GC の使い方情報 ダウンロード先を検索(DownLoad) new deleteよりBoehmGCの方が速い!?実験環境:●●●● CrystalMark 0.6.13.36 2002/7/30 (C)ひよひよ ●●●Crystal Dew World [ http://kotan.ec.hokudai.ac.jp/~hiyohiyo/ ] 【 CPU 】:Athlon XP (Palomino) 【 クロック 】:1666.72(133.34x12.50) MHz x 1 【 CPUID 】:AuthenticAMD 662 【 NameString 】:AMD Athlon(tm) XP 2000+ 【 OS 】:Windows2000 [ 5.0 Build 2195 ] 【マザーボード】: [ AMD 760 ] 【ビデオチップ】:NVIDIA GeForce3 Ti 500 (NV20) 【 メモリ環境 】: [ 512 MB ] 【 HDD 】:ST380021A 【 画面モード 】:1024x768 (16bit) Smoothing None 【CrystalMark 】: 25325 【 ALU 】: 4679 Fibo : 1370 e : 1718 Eratos: 1591 【 FPU 】: 5935 Pure : 1785 Rand : 2396 FFT : 1754 【 GDI 】: 1729 Text : 237 Square: 271 Circle: 772 BitBlt: 449 【 MEM 】: 2783 Read: 258 MB/s Write: 321 MB/s Read/Write: 210 MB/s CacheR/W: 1994 MB/s 【 HDD 】: 6136 Read: 37.9 MB/s ( 1943) Write: 33.5 MB/s ( 1716) RandomRead: 24.3 MB/s ( 1242) RandomWrite: 24.1 MB/s ( 1235) 【 Total 】: 2272 Mandelbrot: 683 QuickSort: 1589 【 DirectDraw 】: 1791 10: 78.6 FPS ( 7) 100: 69.9 FPS ( 69) 500: 46.6 FPS ( 233) 1000: 32.7 FPS ( 327) 5000: 10.9 FPS ( 545) 10000: 6.1 FPS ( 610) ソースはこれ これ実験結果。 LoopNum=1245044 BoehmGCTime=1245044msec new and delete Time=1245056msecさてさて、これはこれで良いのですが^^; newの方はdelete使っているから遅くてあたりまえジャン!って思ってませんか? いやいや、BoehmGCもループが終了(また最初に戻る)時点でメモリを開放しているようなのです。 以下に示します。 ・BoehnGCを使わずかつdeleteで開放しない場合 while(1){ char *p=new char[256] //delete p[] } うわーメモリ増えまくりだよ。 あらあら、デバックスタートで起動させていたけど終了したら一気に開放したよ。 ・BoehnGCを使う while(1){ test *p = new test; } おいおい!増えないジャン!こりゃぁ便利だぁ!!ヽ(゜▽、゜)ノ ウヘヘヘ(壊) BoehmGCをコンパイルするさて〜〜。BoehmGC(以下GC)の凄さが分かったところで!! (smart pointerの方が良いと掲示板等で見るが 私の技術レベルでは到底理解できない。 smart pointerはWindowsプロフェッショナルゲームプログラミングに 説明が書いているので参照してください。)GCをダウンロードしてきましたか?? GCのコンパイルはどうするのよ〜〜。って思いませんか? VisualC++のプロジェクトが無いじゃないか!ヴぁか!って!? 私も最初はコンパイルの仕方にとまどりました。 しか〜し、makefileというコンパイルの方法??らしき物?を記述したファイルがあるので、 それをプロジェクトに追加して命令を加えると、VCが勝手にコンパイルしてくれるようです。 って事でチュートリアル形式で進みますか^^
ガベコレ雑技団(謎BoehmGCのガーべジコレクションの方法はmark-sweep方式らしいことが判明した。 その他のガベコレ方法として copying collection や asymptotic complexity があるらしい事も分かった。BoehmGCは完全にコレクションしきれないらしい。つまり、メモリリークが起こる可能性があるそうだ。 ぶっちゃけ、そんなに気にすることは無いくらいの容量なのだが、私のような狂気的完全主義者(笑)には”なんだかな〜”なのだ。 なので、その他の方法を見てみることにした。 探していたら最強に分かりやすい日本語の資料を発見^^ http://www.ueda.info.waseda.ac.jp/~yamane/ http://www.is.s.u-tokyo.ac.jp/~vu/jugyo/processor/process/soft/compilerresume/index.html 参考サイト、文献 |
更新履歴 2006年8月9日:BoehmGCの記事を大幅改訂 2003年2月26日:BoehmGCの使い方を掲載 2003年2月27日:BoehmGCの使い方を更新 2003/04/08:ソースをUP。 14:34 2003/04/27:ソースが上手くUPできてないのを修正 0:38 2003/07/27:ガベコレ雑技団(謎)の記事をUP 2004/05/11:BoehmGCの参考サイト、文献をUPDxLibFanに戻る DxLibのダウンロードは以下から
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||