メモメモ~
ガベージコレクションについていろいろ調べるとマーク&スウィープだったりコピーイングだったりといったアルゴリズムが出てくる。
それらに出てくるルートだが、具体的にどうやって取得するのかほぼほぼ書かれていなかったのでちょっとメモついでにここに書いておこうという訳で。
何をどうしたらいいのか分かりにくかったが、こちらのブログが大変参考になった。
時の羅針盤@blog
http://compassoftime.blogspot.jp/2010/02/c-copy-gc.html
esp???
なんやねん。
と最初思ったが、スタックポインタと呼ばれるもので要はどこまでスタックが積まれているかここを見ると分かる(という事?)。アセンブリ言語とかやったことある人からしたら常識なんじゃないか?クエスチョン多いな。
スタックポインタの取得
それじゃあ取得してみよう!ということで色々調べた結果Cだとインラインアセンブラを記述して取得できる。だけれども64bitだとそもそもインラインアセンブラが使えないぞと。32bitでしか動かないのは嫌だなあ~。
という訳で代替案
コンパイラ組み込み関数
https://msdn.microsoft.com/ja-jp/library/26td21ds.aspx
にある
_AddressOfReturnAddress組み込み関数
https://msdn.microsoft.com/ja-jp/library/s975zw7k.aspx
この関数を使うと現在の関数のreturnアドレス(戻り番地とか呼ばれてるやつ)が取得できる。
これを使って現在の関数からガベージコレクションの関数を呼んでそのreturnアドレスからエントリー関数のreturnアドレスまでを有効なオブジェクトとしてやって、それらをルートとしてやればうまくいきそう。(試してない)
2017/5/22追記
これはwindowsでVisual Studio c++を使った場合で他の環境には当てはまらないと思う
まあOS変わっても考え方は変わらないはず
図がないから分かりにくいかもしれん。
あと色々間違ってたらすまない。
参考
時の羅針盤@blog
http://compassoftime.blogspot.jp/2010/02/c-copy-gc.html
一般教養としてのGarbage Collection
http://www.is.s.u-tokyo.ac.jp/vu/jugyo/processor/process/soft/compilerresume/gc/gc.html
コンパイラ組み込み関数
https://msdn.microsoft.com/ja-jp/library/26td21ds.aspx
_AddressOfReturnAddress組み込み関数
https://msdn.microsoft.com/ja-jp/library/s975zw7k.aspx