菊池 Blog

移転しました 続・菊池 和彦の足跡

AILight Banner
AILight Blog

プロフィール

菊池 Blog

目次

Blog 利用状況

記事分類

過去の記事

タグ

配列を使ったメモリプール

Visual Studio User Group > フォーラム > メモリ上へのクラスの展開

書き込みエラーになって VSUG に書けないので自Blogで書いてみる。

 

素直に C++/CLR で(Visual C++ Expressでも/clrコンパイルできるよね?)やるのが正解とも思うけど、配列をメモリプールにするってのは珠にやるので書いてみる。

  1. struct は継承できないけどどうするの?
    構造体のメモリイメージを同一にしたいのであれば、構造体の先頭要素に継承元としてあった構造体を置くだけで実現できるので、継承できないことには問題は無い。むしろ継承で書くより構造体のイメージとしてはわかりやすいはず。
    struct Header { GUID type; int length; }
    struct PacketA { Header header; int x; int y; }
    struct PacketB { Header header; int a; int b; }
    Header* と PacketA* ,PacketB*はメモリレイアウトとして互換があるのは当然なのでコンパイラに「大丈夫だ!」と言い聞かせてキャストすれば良い。
  2. GCがメモリ上で配列動かさない?
    「LOHに確保されれば動かされないから大丈夫!」と思っても「たぶん大丈夫」、今後LOHとかの実装変わって泣きたくなければ next を単純ポインタにせずに配列のindexにしよう。
    Task* pt; で pt = pt->next を pt = (Task*)(&pool[ pt->next ])としてもたいしたオーバヘッドにはならない。

まずは素直なロジックにしてみて動かしてメモリ管理が本当にオーバーヘッドになるのかを確認するのが一番最初の手順であることは間違いがない。

投稿日時 : 2007年12月10日 19:21


コメントを追加

タイトル
名前
URL
コメント