2

ご存知のように、C++11 では GC が許可されていますが、主流のコンパイラはどれもそれをサポートしていません。

GCCMSVCIntel CompilersClangなどの主流のコンパイラでこれをいつ実装できるかについての議論はありますか?

この機能を使うのが楽しみです。

4

3 に答える 3

12

あなたは少し誤解しました。

C++11 は、GC とのより良い統合をサポートしています。これは、到達可能なものとそうでないものをより適切に分析するのに役立ついくつかの重要な関数のおかげです。新しい<memory>ヘッダーを確認すると、次のことがわかります。

  • declare_reachable: オブジェクトをリサイクルできないことを宣言します
  • undeclare_reachable: オブジェクトをリサイクルできることを宣言します
  • declare_no_pointers: メモリ領域に追跡可能なポインタが含まれていないことを宣言します
  • undeclare_no_pointers: std::declare_no_pointers の効果をキャンセルします

ただし、これは、C++11 が GC の使用を推奨したり、GC を統合するためにコンパイラをプッシュしたりすることを意味するものではありません。

Boehm-Demers-Weiserのようないくつかの GC は既に存在します。この新しい API は、次の目的で両方と対話するためのインターフェイスの標準化にすぎません。

  • 正確性:declare_reachable場合によっては役立つかもしれませんが、ほとんどの場合は自動的に行われるはずです
  • パフォーマンス: このような GC は型を認識せず、たとえば、整数を含むメモリ領域でポインターを誤って検出する可能性があります。declare_no_pointers一部のメモリ領域をスキャンする必要がなくなり、パフォーマンスが向上し、誤検知が減少します (これにより、パフォーマンスがさらに向上します)。

したがって、必要に応じて Boehm のガベージ コレクターを使用することもできます。C++11 では、GC から別の GC に簡単に切り替えることができるように、標準 API で改善されているだけです。

于 2012-05-14T07:01:16.777 に答える
5

ガベージ コレクションを組み込んだ実装は、おそらく C++98 または C++03 に準拠できません。C++11 は、準拠を可能にするのに十分な機能を追加し、それをわずかに合理的にしようとするために、それをさらに一歩進めています。

より包括的な GC サポートを標準に追加するという提案がありましたが、却下されました。断られたのは、とても理にかなっていると思います。この提案には、標準に対する約 40 ページの変更が含まれていましたが、最終的には、「高品質の実装では、プログラムが利用できるメモリを最大化しようとすることが期待されます」などの非規範的な脚注をサポートするだけでした。

実装に関する限り、(egcs の時代に)Boehm-Demers-Weiser コレクタを egcs に組み込む(の修正版)という話がありました。少なくともある程度はそうしていたバージョンが少なくとも1つあったことを覚えているようです(ただし、それが「リリース」バージョンと見なされたかどうかは覚えていません)。しかし、それはずっと前のことであり、私が知る限り、何年も誰もそれに取り組んでいません. その間、Gcc は十分に変更されているため、誰かが今日やりたいと思った場合、おそらく最初からやり直す必要があります。

これにより、Microsoft の C++/CLI が標準に準拠していなかった領域が少なくとも 1 つ取り除かれると思います。そのため、他の場所でどの程度の準拠が必要かによっては、C++/CLI をゴミのある C++ として (一種の) 扱うことができます。コレクション。ただし、ほとんどの人はそれをあまり補完的でないと考えています (また、Microsoft でさえ、.NET と実際の C++ の間の相互運用性をリンクするためだけにそれを推奨しています)。

Clang は、GC をサポートするためのフックを含む LLVM をターゲットにしています (他のプロジェクトで使用され、証明されています)。そのため、おそらく、比較的近いうちに機能する実装を作成できる可能性が最も高くなります。

私は明らかに間違っている可能性がありますが、Intel がすぐにガベージ コレクターを組み込むとは思いません。Intel は最高の出力コードを生成することに専念しており、GC はおそらくそれほど役に立たないでしょう。彼らがそうする可能性が高い主な理由は、Intelが多くの努力を払っている別の領域であるマルチスレッドを簡素化することです(ただし、少なくともこれまでのところ、コンパイラ自体よりもライブラリに多くの努力を払っています).

リリースされたほとんどの C++ コードで GC が主流になりつつあることについては、ほとんどまたはまったく需要がなく、関心さえないようです。私が最初にこの回答を書いたとき、誰かが今までに書いていただろうと思いました。その間、C++ の GC への関心は薄れたようで、今後もそうなる可能性があるとはまったく確信が持てません。それはまだ起こる可能性がありますが、それが起こる可能性が高い時期を予測するのに十分な関心はありません. どちらかといえば、RAII のセマンティクスを明示的に成文化する Rust のようなモデルに移行することに、おそらくもっと関心があると思います (しかし、その一般的なアイデアはある程度の関心を集めているように見えますが、それがいつ実現するかを予測するのに十分具体的なものは見たことがありません)。どちらかになる可能性が高い)。

于 2012-05-14T08:30:49.073 に答える
3

C++11 標準では、ガベージ コレクションを実装するための言語サポートが追加されましたが、実際に動作するガベージ コレクターはありません。C++ で動作する gc ライブラリの最も顕著な例は、Hans Boehm の実装です。私の知る限り、現時点ではこのライブラリを主要なコンパイラと統合する計画はありませんが、標準の委員会がガベージ コレクタを次のバージョンのC++.

(*) たとえば、Going Native 2012 の専門家パネルを参照

于 2012-05-14T07:00:12.037 に答える