SlideShare a Scribd company logo
GC in C++0x

  2010/8/8 GC本読書会

  新 康孝
  yak_ex
自己紹介
 氏名: 新 康孝 (あたらし やすたか)
 Twitter ID: yak_ex
 Web: http://yak3.myhome.cx:8080/junks

 C++ / Perl が主戦場
 某自動車部品メーカーから某自動車メーカーへ出向中
 現在、仕事でコードに触れていない
 競技プログラミング(TopCoder、Codeforces)で
  潤い補充
 GC は「ど素人」
渡る世間は GC ばかり
 Google Code Jam 2010 Qualifier 使用言語
 1位   C++    4911 6位    Ruby      221
 2位   Java   2762 7位    PHP       170
 3位   Python 1459 8位    Perl      146
 4位   C       751 9位    Haskell   118
 5位   C#      648 10位   Pascal     95
渡る世間は GC ばかり
 Google Code Jam 2010 Qualifier 使用言語
 1位   C++    4911 6位    Ruby      221
 2位   Java   2762 7位    PHP       170
 3位   Python 1459 8位    Perl      146
 4位   C       751 9位    Haskell   118
 5位   C#      648 10位   Pascal     95

 黄色ハイライト=GC有り言語
渡る世間は GC ばかり
 Google Code Jam 2010 Qualifier 使用言語
 1位   C++    4911 6位    Ruby      221
 2位   Java   2762 7位    PHP       170
 3位   Python 1459 8位    Perl      146
 4位   C       751 9位    Haskell   118
 5位   C#      648 10位   Pascal     95

 黄色ハイライト=GC有り言語
 超一線級言語でありながら GC 無し : C++は孤高
C++は孤高
 そんな C++ を支える C++er 達
C++は孤高
 そんな C++ を支える C++er 達
     闇
C++は孤高
 そんな C++ を支える C++er 達
     闇

     の
C++は孤高
 そんな C++ を支える C++er 達
     闇

     の

     軍
C++は孤高
 そんな C++ を支える C++er 達
     闇

     の

     軍

     団
C++は孤高
 そんな C++ を支える C++er 達
     闇へ

     の   ん
     軍た

     団い
マルチパラダイム変態言語C++
 次期標準規格 C++ 0x では

          Support for
       Garbage Collection
             and
Reachability-Based Leak Detection
マルチパラダイム変態言語C++
 次期標準規格 C++ 0x では

  Minimal Support for
       Garbage Collection
             and
Reachability-Based Leak Detection
Minimal Support for GC 以下略
 いくつかの概念
  Traceable pointer object
  Safely-derived pointer (value)
 5つの関数
  get_pointer_safety()
  (un)declare_no_pointers()
  (un)declare_reachable()
いくつかの概念(1)
 Traceable pointer object
   ポインタobj
   ポインタを格納するのに十分なサイズの整数obj
   キャラクタ型の配列の一部分
    キャラクタ型だけな理由は恐らく strict aliasing rule
  →ポインタ値が入っているかもしれないと処理系に
   認識してもらえるobject
  =他の部分にはポインタ値が入っていない前提
いくつかの概念(2)
 Safely-derived pointer (value)
   ::operator new で返ってきた値 (例: new T)
   Safely-derived pointer value に対する
     逆参照→参照の結果 (例: &*p)
     ポインタ値の well-defined な演算結果 (例: p+1)
     ポインタ間の well-defined な変換結果
       (例: static_cast<void*>(p))
     ポインタ・整数値間の reinterpret_cast による変換結果
       (例: reinterpret_cast<intptr_t>(p))
  →::operator new で確保された領域で
    かつ有効であることが
    処理系から確実に追跡可能なポインタ値
いくつかの概念(3)
 Safely-derived pointer (value)
                             これは safely-derived pointer value

  T *p = new T;
  intptr_t x = reinterpret_cast<intptr_t>(p) ^ 0x555
  a:
  T *q = reinterpret_cast<T*>(x ^ 0x555);
  T y = *q;


                       こっちは safely-derived pointer value ではない

                    これも safely-derived pointer value ではない!
                    ※値としては p と同じだが、結果ではなくて過程で判断
Minimal Support for GC 以下略
 いくつかの概念
  Traceable pointer object
  Safely-derived pointer (value)
 5つの関数
  get_pointer_safety()
  (un)declare_no_pointers()
  (un)declare_reachable()
関数: get_pointer_safety()
 処理系のポインタ安全性(pointer safety)を
  返す
                Safely-derived pointer であるかによって
  relaxed:     処理が変わらない=C++03相当
                ※relaxed と preferred は処理系定義
  preferred:     preferred だと leak detector があったりする
                  かもしれない
                ※VC2010 は relaxed 返して他の関数も何もしない


  strict:      safely-derived pointer でないポインタ値
                (かつ後述の declare_reachable() が呼ばれてい
                ない値)を介して動的確保された領域を逆参照、解放
                すると未定義動作
Strict pointer safety
 Safely-derived pointer (value)
                             これは safely-derived pointer value

  T *p = new T;
  intptr_t x = reinterpret_cast<intptr_t>(p) ^ 0x555
  a:
  T *q = reinterpret_cast<T*>(x ^ 0x555);
  T y = *q;


                       こっちは safely-derived pointer value ではない

                    これも safely-derived pointer value ではない!
   未定義動作
                    ※値としては p と同じだが、結果ではなくて過程で判断
関数: (un)declare_no_pointers()
 void declare_no_pointers(char *p,
  size_t n);
 void undeclare_no_pointers(char *p,
  size_t n);
 指定された領域内にポインタ値がないことを
  指定 or 指定解除する
→GC のスキャン範囲を狭められる
関数: (un)declare_reachable
 void declare_reachable(void *p);
   safely-derived な pointer 値 p の参照先を
    reachable だと宣言する
  →参照先を GC 対象からはずす
 template<class T>
  T* undeclare_reachable(T *p);
   参照先が reachable な p に対して、
    safely-derived な pointer 値(pと同じ値)を返す
  →参照先が GC 対象に復帰する
   (※返値が safely-derived なので有効である間はGCされ
    ない)
(un)declare_reachable()の使い方
 どうして必要なの?                   これは safely-derived pointer value

   T *p = new T;
   intptr_t x = reinterpret_cast<intptr_t>(p) ^ 0x555
   a:
   T *q = reinterpret_cast<T*>(x ^ 0x555);
   T y = *q;

                        こっちは safely-derived pointer value ではない
    未定義動作            これも safely-derived pointer value ではない!
                     ※値としては p と同じだが、結果ではなくて過程で判断

「ラベル a: の位置で GC がかかると p の参照先が回収される」 ???
(un)declare_reachable()の使い方
 どうして必要なの?                   これは safely-derived pointer value

   T *p = new T;
   intptr_t x = reinterpret_cast<intptr_t>(p) ^ 0x555
   a:
   T *q = reinterpret_cast<T*>(x ^ 0x555);
   T y = *q;

                        こっちは safely-derived pointer value ではない
    未定義動作            これも safely-derived pointer value ではない!
                     ※値としては p と同じだが、結果ではなくて過程で判断

「ラベル a: の位置で GC がかかると p の参照先が回収される」                 問題は最適化
(un)declare_reachable()の使い方
 どうして必要なの?
   T *p = new T;                                        以降 p の値は
   intptr_t x = reinterpret_cast<intptr_t>(p) ^ 0x555   使われない
   a:
   T *q = reinterpret_cast<T*>(x ^ 0x555);
   T y = *q;

   ※ p, x, q を同じレジスタに割り当てることが可能                         以降 x の値は
   →ラベル a: の時点で p の値がどこにも存在しない                          使われない
   →p の参照先 = q の参照先が GC の回収対象になる!!
   →*q で未定義動作

「ラベル a: の位置で GC がかかると p の参照先が回収される」                 問題は最適化
(un)declare_reachable()の使い方
     C++0xでの正しいコード
*p は
reachable T *p = new T;
=         declare_reachable(p); // 偽装前に declare_reachable() を呼ぶ
GC対象外 intptr_t x = reinterpret_cast<intptr_t>(p) ^ 0x555
          a:
          // T z = *reinterpret_cast<T*>(x ^ 0x555); // 合法
          // 偽装終了時に undeclare_reachable() を呼ぶ
          T *q = undeclare_reachable(reinterpret_cast<T*>(x ^ 0x555));
          T y = *q;
注
※ declare_reachable した値と同じであれば safely-derived でなくとも逆参照が可能
※ undeclare_reachable の引数は safely-derived でなくとも reachable であれば良い
※ declare_reachable については「ポインタ値を偽装する」点が問題
   a: で関数が別れている場合を考えれば最適化なしで議論は一緒
まとめ
 C++0x では最小限の GC サポートがある
   Safely-derived pointer という概念
    = GC されていない生きているポインタ値
   5 つの関数が追加
 C++03相当でも規格合致(relaxed)
   しばらくそれ以上の実装はでなさそう?
 ポインタ値を偽装するコードは
  declare_reachable() / undeclare_reachable()
  を使って修正する必要がある
参考文献
 N2670: Minimal Support for Garbage
  Collection and Reachability-Based Leak
  Detection (revised)
  http://www.open-
  std.org/jtc1/sc22/wg21/docs/papers/2008/
  n2670.htm
 Garbage Collection in the Next C++
  Standard
  http://www.hpl.hp.com/techreports/2009/H
  PL-2009-360.pdf

More Related Content

What's hot (20)

定理証明支援系Coqについて by Yoshihiro Mizoguchi, has 45 slides with 8187 views.数学ソフトウェアとフリードキュメントXXI 講演資料 (2015/9/12)
定理証明支援系Coqについて定理証明支援系Coqについて
定理証明支援系Coqについて
Yoshihiro Mizoguchi
45 slides8.2K views
Coqチュートリアル by Yoshihiro Mizoguchi, has 36 slides with 3247 views.九州大学ウィンタースクール「数学ソフトウェア・チュートリアル」講演スライド サンプルファイルは以下に置いています. https://github.com/KyushuUniversityMathematics/CoqExamples/tree/master/20150218
CoqチュートリアルCoqチュートリアル
Coqチュートリアル
Yoshihiro Mizoguchi
36 slides3.2K views
Scala 初心者が米田の補題を Scala で考えてみた by Kazuyuki TAKASE, has 64 slides with 6282 views.このスライドは、2020/10/17 - 18 に開催された「ScalaMatsuri」で発表したものです。
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
Kazuyuki TAKASE
64 slides6.3K views
Emcpp item31 by mitsutaka_takeda, has 25 slides with 11348 views.Effective Modern C++勉強会用資料 https://atnd.org/events/67443
Emcpp item31Emcpp item31
Emcpp item31
mitsutaka_takeda
25 slides11.3K views
Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ) by Shinya Takamaeda-Y, has 27 slides with 4880 views.Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)(2015年12月8日)
Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)
Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)
Shinya Takamaeda-Y
27 slides4.9K views
C++入門? by tsudaa, has 32 slides with 3616 views.昔からC++ の入門書に違和感があったので、ちょっとそれについてまとめてみました
C++入門?C++入門?
C++入門?
tsudaa
32 slides3.6K views
Pythonを用いた高水準ハードウェア設計環境の検討 by Shinya Takamaeda-Y, has 34 slides with 4343 views.Pythonを用いた高水準ハードウェア設計環境の検討(2015年9月18日 リコンフィギャラブルシステム研究会(RECONF) @愛媛大学)
Pythonを用いた高水準ハードウェア設計環境の検討Pythonを用いた高水準ハードウェア設計環境の検討
Pythonを用いた高水準ハードウェア設計環境の検討
Shinya Takamaeda-Y
34 slides4.3K views
error handling using expected by Akira Takahashi, has 30 slides with 2977 views.Boost.勉強会 #19 東京での発表「expectedによるエラーハンドリング」
error handling using expectederror handling using expected
error handling using expected
Akira Takahashi
30 slides3K views
あまぁいRcpp生活 by Masaki Tsuda, has 63 slides with 817 views.Rの関数をC++で実装することを可能にするパッケージRcppの紹介です。
あまぁいRcpp生活あまぁいRcpp生活
あまぁいRcpp生活
Masaki Tsuda
63 slides817 views
PythonとVeriloggenを用いたRTL設計メタプログラミング by Shinya Takamaeda-Y, has 34 slides with 4926 views.PythonとVeriloggenを用いたRTL設計メタプログラミング(チュートリアル)(2016年3月2日 第3回人工知能とHW/SW協調設計ワークショップ @沖縄)
PythonとVeriloggenを用いたRTL設計メタプログラミングPythonとVeriloggenを用いたRTL設計メタプログラミング
PythonとVeriloggenを用いたRTL設計メタプログラミング
Shinya Takamaeda-Y
34 slides4.9K views
Effective modern C++ 勉強会 #3 Item 12 by Keisuke Fukuda, has 20 slides with 2399 views.2015/03/25 Effective modern C++勉強会の発表資料です。
Effective modern C++ 勉強会 #3 Item 12Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
Keisuke Fukuda
20 slides2.4K views
JavaScript 勉強会 ― 変数・演算子・文 by Appresso Engineering Team, has 29 slides with 583 views.JavaScript 勉強会、「JavaScript 第6版」の 3 章「型、値、変数」の変数、4 章「式と演算子」、5 章「文」のスライド。
JavaScript 勉強会 ― 変数・演算子・文JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文
Appresso Engineering Team
29 slides583 views
C++0x in programming competition by yak1ex, has 24 slides with 1021 views.Presented at Open Source Conference 2011 Nagoya on 2011/8/20.
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
24 slides1K views
Scala 初心者が Hom 函手を Scala で考えてみた by Kazuyuki TAKASE, has 21 slides with 527 views.このスライドは、2020/08/30 に開催された「Pre-ScalaMatsuri」で発表したものです。
Scala 初心者が Hom 函手を Scala で考えてみたScala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみた
Kazuyuki TAKASE
21 slides527 views

Similar to GC in C++0x (20)

組み込みでこそC++を使う10の理由 by kikairoya, has 32 slides with 27309 views.
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
32 slides27.3K views
Cython intro prelerease by Shiqiao Du, has 23 slides with 1864 views.2012-MAR-18に開催されるTokyo.Scipy#3にて発表予定の内容の一部
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
Shiqiao Du
23 slides1.9K views
NumPyが物足りない人へのCython入門 by Shiqiao Du, has 71 slides with 37417 views.18 Mar. 2012 第3回Tokyo.Scipyにて発表したスライドです。 CythonだけではなくF2Pyにも触れていてかなりカオスな内容です。
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
Shiqiao Du
71 slides37.4K views
C# 9.0 / .NET 5.0 by 信之 岩永, has 64 slides with 2678 views.Visual Studio Users Community Japan 勉強会 #6 https://vsuc.connpass.com/event/192835/ にて登壇。 C# 9.0/.NET 5.0 世代の大まかな流れと、C# 9.0の主要な機能を紹介します。
C# 9.0 / .NET 5.0C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
信之 岩永
64 slides2.7K views
わんくま同盟大阪勉強会#61 by TATSUYA HAYAMIZU, has 66 slides with 968 views.わんくま同盟大阪勉強会#61 セッション資料
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
TATSUYA HAYAMIZU
66 slides968 views
Coq 20100208a by tmiya, has 36 slides with 3663 views.第1回FormalMethods勉強会
Coq 20100208aCoq 20100208a
Coq 20100208a
tmiya
36 slides3.7K views
Chainer/CuPy v5 and Future (Japanese) by Seiya Tokui, has 22 slides with 976 views.Chainer Meetup #08 でのスライドです
Chainer/CuPy v5 and Future (Japanese)Chainer/CuPy v5 and Future (Japanese)
Chainer/CuPy v5 and Future (Japanese)
Seiya Tokui
22 slides976 views
Visual C++コード分析を支えるSAL by egtra, has 33 slides with 4235 views.Boost.勉強会 #21 札幌の発表時のスライドです。Visual C++のコード分析機能で使われるSALの導入的な説明です。
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
egtra
33 slides4.2K views
C++0x総復習 by 道化師 堂華, has 170 slides with 4935 views.FDIS(N3290) をベースにしたC++0xの総復習です。 Boost.勉強会 #5 名古屋 ( http://partake.in/events/b9463b89-0a08-4996-9843-f52252ed2dcf )にて発表。
C++0x総復習C++0x総復習
C++0x総復習
道化師 堂華
170 slides4.9K views
Python standard 2022 Spring by anyakichi, has 47 slides with 255 views.2022 の Python はこう書け的な。
Python standard 2022 SpringPython standard 2022 Spring
Python standard 2022 Spring
anyakichi
47 slides255 views
Chainerの使い方と自然言語処理への応用 by Seiya Tokui, has 40 slides with 53256 views.第10回 NLP若手の会シンポジウム (YANS) のチュートリアルスライドです。ニューラルネットの(アルゴリズムとしての)おさらいと、Chainer v1.3.0の使い方を紹介しています。
Chainerの使い方と自然言語処理への応用Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用
Seiya Tokui
40 slides53.3K views
Slide by Takefumi MIYOSHI, has 26 slides with 1169 views.OpenCL +alpha. (1) OpenCL + I/O (2) trying kinds of high-level languages for OpenCL
SlideSlide
Slide
Takefumi MIYOSHI
26 slides1.2K views
T69 c++cli ネイティブライブラリラッピング入門 by 伸男 伊藤, has 65 slides with 5303 views.
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
65 slides5.3K views
マーク&スイープ勉強会 by 7shi , has 39 slides with 5750 views.マーク&スイープ勉強会の発表資料です。
マーク&スイープ勉強会マーク&スイープ勉強会
マーク&スイープ勉強会
7shi
39 slides5.8K views
Introduction to NumPy & SciPy by Shiqiao Du, has 38 slides with 9421 views.Tokyo.SciPy 2011/8/28 で使用
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
Shiqiao Du
38 slides9.4K views
Live Coding で学ぶ C# 7 by Takaaki Suzuki, has 20 slides with 877 views.2016/07/16 時点での C# 7 の新機能についてご紹介
Live Coding で学ぶ C# 7Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7
Takaaki Suzuki
20 slides877 views
組み込みでこそC++を使う10の理由 by kikairoya, has 32 slides with 27309 views.
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
32 slides27.3K views
T69 c++cli ネイティブライブラリラッピング入門 by 伸男 伊藤, has 65 slides with 5303 views.
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
65 slides5.3K views

More from yak1ex (9)

C++0x in programming competition by yak1ex, has 24 slides with 1791 views.P
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
24 slides1.8K views
Introduction to programming competition [revised][PDF] by yak1ex, has 22 slides with 958 views.Presented at Open Source Conference 2011 Nagoya on 2011/8/20. (revised)
Introduction to programming competition [revised][PDF]Introduction to programming competition [revised][PDF]
Introduction to programming competition [revised][PDF]
yak1ex
22 slides958 views
Introduction to programming competition [revised] by yak1ex, has 22 slides with 722 views.Presented at
Introduction to programming competition [revised]Introduction to programming competition [revised]
Introduction to programming competition [revised]
yak1ex
22 slides722 views
Introduction to programming competition by yak1ex, has 22 slides with 1726 views.Presented at Open Source Conference 2011 Nagoya on 2011/8/20.
Introduction to programming competitionIntroduction to programming competition
Introduction to programming competition
yak1ex
22 slides1.7K views
Impractical Introduction of Boost Spirit Qi [PPT] by yak1ex, has 56 slides with 1564 views.for Boost Study Meeting #5 at Nagoya
Impractical Introduction of Boost Spirit Qi [PPT]Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]
yak1ex
56 slides1.6K views
Brief introduction of Boost.ICL [PDF] by yak1ex, has 15 slides with 810 views.Not yet presented anywhere. Uploaded via PDF, thus layout is nearer from original but without notes
Brief introduction of Boost.ICL [PDF]Brief introduction of Boost.ICL [PDF]
Brief introduction of Boost.ICL [PDF]
yak1ex
15 slides810 views
Brief introduction of Boost.ICL by yak1ex, has 15 slides with 2 views.Not yet presented anywhere.
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
yak1ex
15 slides2 views
Brief introduction of Boost.ICL by yak1ex, has 15 slides with 696 views.Not presented anywhere.
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
yak1ex
15 slides696 views
GC in C++0x [eng] by yak1ex, has 23 slides with 872 views.1. C++0x will include minimal support for garbage collection (GC) through concepts like traceable pointer objects and safely-derived pointer values. 2. It adds 5 new functions related to GC like get_pointer_safety() and declare_reachable(). 3. Code that disguises pointer values may need to use declare_reachable() and undeclare_reachable() to avoid objects being collected by GC improperly.
GC in C++0x [eng]GC in C++0x [eng]
GC in C++0x [eng]
yak1ex
23 slides872 views
C++0x in programming competition by yak1ex, has 24 slides with 1791 views.P
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
24 slides1.8K views

GC in C++0x

  • 1. GC in C++0x 2010/8/8 GC本読書会 新 康孝 yak_ex
  • 2. 自己紹介  氏名: 新 康孝 (あたらし やすたか)  Twitter ID: yak_ex  Web: http://yak3.myhome.cx:8080/junks  C++ / Perl が主戦場  某自動車部品メーカーから某自動車メーカーへ出向中  現在、仕事でコードに触れていない  競技プログラミング(TopCoder、Codeforces)で 潤い補充  GC は「ど素人」
  • 3. 渡る世間は GC ばかり  Google Code Jam 2010 Qualifier 使用言語 1位 C++ 4911 6位 Ruby 221 2位 Java 2762 7位 PHP 170 3位 Python 1459 8位 Perl 146 4位 C 751 9位 Haskell 118 5位 C# 648 10位 Pascal 95
  • 4. 渡る世間は GC ばかり  Google Code Jam 2010 Qualifier 使用言語 1位 C++ 4911 6位 Ruby 221 2位 Java 2762 7位 PHP 170 3位 Python 1459 8位 Perl 146 4位 C 751 9位 Haskell 118 5位 C# 648 10位 Pascal 95  黄色ハイライト=GC有り言語
  • 5. 渡る世間は GC ばかり  Google Code Jam 2010 Qualifier 使用言語 1位 C++ 4911 6位 Ruby 221 2位 Java 2762 7位 PHP 170 3位 Python 1459 8位 Perl 146 4位 C 751 9位 Haskell 118 5位 C# 648 10位 Pascal 95  黄色ハイライト=GC有り言語  超一線級言語でありながら GC 無し : C++は孤高
  • 6. C++は孤高  そんな C++ を支える C++er 達
  • 7. C++は孤高  そんな C++ を支える C++er 達 闇
  • 8. C++は孤高  そんな C++ を支える C++er 達 闇 の
  • 9. C++は孤高  そんな C++ を支える C++er 達 闇 の 軍
  • 10. C++は孤高  そんな C++ を支える C++er 達 闇 の 軍 団
  • 11. C++は孤高  そんな C++ を支える C++er 達 闇へ の ん 軍た 団い
  • 12. マルチパラダイム変態言語C++  次期標準規格 C++ 0x では Support for Garbage Collection and Reachability-Based Leak Detection
  • 13. マルチパラダイム変態言語C++  次期標準規格 C++ 0x では Minimal Support for Garbage Collection and Reachability-Based Leak Detection
  • 14. Minimal Support for GC 以下略  いくつかの概念  Traceable pointer object  Safely-derived pointer (value)  5つの関数  get_pointer_safety()  (un)declare_no_pointers()  (un)declare_reachable()
  • 15. いくつかの概念(1)  Traceable pointer object  ポインタobj  ポインタを格納するのに十分なサイズの整数obj  キャラクタ型の配列の一部分 キャラクタ型だけな理由は恐らく strict aliasing rule →ポインタ値が入っているかもしれないと処理系に 認識してもらえるobject =他の部分にはポインタ値が入っていない前提
  • 16. いくつかの概念(2)  Safely-derived pointer (value)  ::operator new で返ってきた値 (例: new T)  Safely-derived pointer value に対する  逆参照→参照の結果 (例: &*p)  ポインタ値の well-defined な演算結果 (例: p+1)  ポインタ間の well-defined な変換結果 (例: static_cast<void*>(p))  ポインタ・整数値間の reinterpret_cast による変換結果 (例: reinterpret_cast<intptr_t>(p)) →::operator new で確保された領域で かつ有効であることが 処理系から確実に追跡可能なポインタ値
  • 17. いくつかの概念(3)  Safely-derived pointer (value) これは safely-derived pointer value T *p = new T; intptr_t x = reinterpret_cast<intptr_t>(p) ^ 0x555 a: T *q = reinterpret_cast<T*>(x ^ 0x555); T y = *q; こっちは safely-derived pointer value ではない これも safely-derived pointer value ではない! ※値としては p と同じだが、結果ではなくて過程で判断
  • 18. Minimal Support for GC 以下略  いくつかの概念  Traceable pointer object  Safely-derived pointer (value)  5つの関数  get_pointer_safety()  (un)declare_no_pointers()  (un)declare_reachable()
  • 19. 関数: get_pointer_safety()  処理系のポインタ安全性(pointer safety)を 返す Safely-derived pointer であるかによって  relaxed: 処理が変わらない=C++03相当 ※relaxed と preferred は処理系定義  preferred: preferred だと leak detector があったりする かもしれない ※VC2010 は relaxed 返して他の関数も何もしない  strict: safely-derived pointer でないポインタ値 (かつ後述の declare_reachable() が呼ばれてい ない値)を介して動的確保された領域を逆参照、解放 すると未定義動作
  • 20. Strict pointer safety  Safely-derived pointer (value) これは safely-derived pointer value T *p = new T; intptr_t x = reinterpret_cast<intptr_t>(p) ^ 0x555 a: T *q = reinterpret_cast<T*>(x ^ 0x555); T y = *q; こっちは safely-derived pointer value ではない これも safely-derived pointer value ではない! 未定義動作 ※値としては p と同じだが、結果ではなくて過程で判断
  • 21. 関数: (un)declare_no_pointers()  void declare_no_pointers(char *p, size_t n);  void undeclare_no_pointers(char *p, size_t n);  指定された領域内にポインタ値がないことを 指定 or 指定解除する →GC のスキャン範囲を狭められる
  • 22. 関数: (un)declare_reachable  void declare_reachable(void *p);  safely-derived な pointer 値 p の参照先を reachable だと宣言する →参照先を GC 対象からはずす  template<class T> T* undeclare_reachable(T *p);  参照先が reachable な p に対して、 safely-derived な pointer 値(pと同じ値)を返す →参照先が GC 対象に復帰する (※返値が safely-derived なので有効である間はGCされ ない)
  • 23. (un)declare_reachable()の使い方  どうして必要なの? これは safely-derived pointer value T *p = new T; intptr_t x = reinterpret_cast<intptr_t>(p) ^ 0x555 a: T *q = reinterpret_cast<T*>(x ^ 0x555); T y = *q; こっちは safely-derived pointer value ではない 未定義動作 これも safely-derived pointer value ではない! ※値としては p と同じだが、結果ではなくて過程で判断 「ラベル a: の位置で GC がかかると p の参照先が回収される」 ???
  • 24. (un)declare_reachable()の使い方  どうして必要なの? これは safely-derived pointer value T *p = new T; intptr_t x = reinterpret_cast<intptr_t>(p) ^ 0x555 a: T *q = reinterpret_cast<T*>(x ^ 0x555); T y = *q; こっちは safely-derived pointer value ではない 未定義動作 これも safely-derived pointer value ではない! ※値としては p と同じだが、結果ではなくて過程で判断 「ラベル a: の位置で GC がかかると p の参照先が回収される」 問題は最適化
  • 25. (un)declare_reachable()の使い方  どうして必要なの? T *p = new T; 以降 p の値は intptr_t x = reinterpret_cast<intptr_t>(p) ^ 0x555 使われない a: T *q = reinterpret_cast<T*>(x ^ 0x555); T y = *q; ※ p, x, q を同じレジスタに割り当てることが可能 以降 x の値は →ラベル a: の時点で p の値がどこにも存在しない 使われない →p の参照先 = q の参照先が GC の回収対象になる!! →*q で未定義動作 「ラベル a: の位置で GC がかかると p の参照先が回収される」 問題は最適化
  • 26. (un)declare_reachable()の使い方  C++0xでの正しいコード *p は reachable T *p = new T; = declare_reachable(p); // 偽装前に declare_reachable() を呼ぶ GC対象外 intptr_t x = reinterpret_cast<intptr_t>(p) ^ 0x555 a: // T z = *reinterpret_cast<T*>(x ^ 0x555); // 合法 // 偽装終了時に undeclare_reachable() を呼ぶ T *q = undeclare_reachable(reinterpret_cast<T*>(x ^ 0x555)); T y = *q; 注 ※ declare_reachable した値と同じであれば safely-derived でなくとも逆参照が可能 ※ undeclare_reachable の引数は safely-derived でなくとも reachable であれば良い ※ declare_reachable については「ポインタ値を偽装する」点が問題 a: で関数が別れている場合を考えれば最適化なしで議論は一緒
  • 27. まとめ  C++0x では最小限の GC サポートがある  Safely-derived pointer という概念 = GC されていない生きているポインタ値  5 つの関数が追加  C++03相当でも規格合致(relaxed)  しばらくそれ以上の実装はでなさそう?  ポインタ値を偽装するコードは declare_reachable() / undeclare_reachable() を使って修正する必要がある
  • 28. 参考文献  N2670: Minimal Support for Garbage Collection and Reachability-Based Leak Detection (revised) http://www.open- std.org/jtc1/sc22/wg21/docs/papers/2008/ n2670.htm  Garbage Collection in the Next C++ Standard http://www.hpl.hp.com/techreports/2009/H PL-2009-360.pdf