マーク&スイープ勉強会

マーク&スイープ勉強会関連のつぶやきです。
1
前へ 1 ・・ 7 8
七誌 @7shi

@nagoya313 ひょっとしたらg++とMSVCでラムダ式の内部表現が異なるかもしれませんね。そのコードを参考に確認してみます。

2011-12-12 22:18:41
七誌 @7shi

ラムダ式をスタックに作ってスキャンする実験を開始

2011-12-12 23:00:27
七誌 @7shi

うわ、寝落ちしていた。朝起きれたらやろう・・・

2011-12-13 00:07:21
七誌 @7shi

@nagoya313 このコードで実験した結果、MSVCではキャプチャした変数がスタックの走査で出てくるのに対して、g++だとvtableみたいな感じで一度ポインタをたどらないと検出できないことがわかりました。 http://t.co/J5yDx8a3

2011-12-13 07:43:38
隅須正昭 @nagoya313

@7shi 参照キャプチャと値キャプチャでは違う感じなんですかね。

2011-12-13 21:21:30
七誌 @7shi

@nagoya313 参照はアセンブリレベルではポインタと同じ扱いなので、ポインタを値キャプチャすれば参照キャプチャと同じ結果となりました。 http://t.co/J5yDx8a3 この結果から、MSVCだとgc_ptrがなくても検出可能ですが、g++では不可となります。

2011-12-13 21:48:24
隅須正昭 @nagoya313

@7shi とするとこの間のコードでg++でも回収されたのはどうしてなんでしょうか

2011-12-13 21:58:53
七誌 @7shi

@nagoya313 ええと、すみません、問題点が分からなくなって来ました。この前のコードというのは http://t.co/uCSQh2NL のfooをmain内に展開したコードのことでしょうか?私がgc_ptrを導入したのは、2段階参照が単なるスキャンで検出できないためです。

2011-12-13 22:06:57
隅須正昭 @nagoya313

@7shi その辺です。資料のクロージャの例をgc_ptrにしなくても生ポインタで解放されている様に見えるって話です。

2011-12-13 22:11:50
七誌 @7shi

@nagoya313 資料の例は、ポインタが検出できない(=マークされない)ために、解放されてはいけないタイミングで解放されてしまうのを問題視しています。この例では127行目のgc_collect()で解放されないのが正しい動作です。 http://t.co/cm0nAdMH

2011-12-13 22:22:56
隅須正昭 @nagoya313

@7shi なるほど、根本的に勘違いしていたようです。ありがとうございました。

2011-12-13 22:29:17
七誌 @7shi

@nagoya313 それは良かったです。私も今回の議論がなければMSVCでキャプチャの内部仕様が異なることに気付かなかったので、助かりました。

2011-12-13 22:32:31
隅須正昭 @nagoya313

@7shi 詰まりはmsvcではgc_ptrはいらないってことですよね。あともしかしたらですが、ラムダというよりはstd::functionの実装の差って説はないでしょうか。

2011-12-13 22:37:27
七誌 @7shi

@nagoya313 はい、今回のようなキャプチャに対して、MSVCではgc_ptrは必要ありません。ですがgc_ptrは『GC管理されていないインスタンス』から『GC管理されているインスタンス』を参照している間は解放させないためのものなので、その用途では必要です。

2011-12-13 22:51:03
七誌 @7shi

@nagoya313 std::functionの件は確かにそうですね。今から実験してみます。

2011-12-13 22:51:28
七誌 @7shi

@nagoya313 ラムダ式をスキャンしたところ値が検出されました。std::functionの実装の差のようです。 http://t.co/HFvqN7jQ ご指摘ありがとうございました。

2011-12-13 23:08:01
前へ 1 ・・ 7 8