12

ある種のコンパイラ マジック (TM) に依存する特定の C++11 機能があることに、試行錯誤の結果、私の注意が向けられました。私は独自の標準準拠 stdlib の実装をいじっています。stdlib の実装がすぐに利用できることは知っていますが、これは小さなアプリケーション用の私自身のバージョンです。

昨夜std::initializer_list、私は仕様に従って実装しましたが、うまく機能させることができませんでした。高低の答えを探しましたが、それは不可能であり、コンパイラ自体に変更が必要であるという声明が残っていました. さて、私はそれの現在の実装を見てみることにしましたlibstdc++、そして確かに私の実装はデザインがまったく同じで、端がわずかに異なっているだけでした.のものと同じデザインlibstdc++です。名前空間 std にある必要があることに気付くまでに 6 時間かかりました。実装は、可能にするコンパイラへのプロキシであることが判明し、コンパイラ自体がクラスをinitializer_list検索しますinitializer_listnamespace std.

私の質問は、ある種の特別なコンパイラ マジックが機能すること、隠されたプロキシ接続を必要とすること、または新しい C++11 ライブラリ機能のいずれかのコンパイラ イントリスティックを秘密にすることを認識する必要がある他のライブラリ機能がもうないことです。これらを事前に知りたいので、コンパイラの魔法に依存する他の機能を実装するときに備えて、試行錯誤でそれを理解するために丸一日を無駄にするのではなく; これは退屈でかなり面倒になる可能性があります。

ありがとう。

4

2 に答える 2

11

の関数は<exception>、ほとんどがコンパイラへのフックです。

いくつかの<type_traits>プロパティ クエリは、コンパイラの支援なしでは実装できないか、実装が非常に困難です。単に難しいものでも、コンパイラのネイティブ stdlib が「チート」によって成功する場合に誤動作する可能性があります。もちろん、コンパイルも高速になります。

とが最初の使用時に自動的に初期化される<iostream>ように記述することは可能ですが、ほとんどのコンパイラは、それらが最初に静的初期化されるようにチートしてリンクすることを選択します。cincout

<typeinfo>もちろん、コンパイラが期待するものと正確に一致する必要があります。

わからないこと、考えられないことがまだまだあると思います。

標準ライブラリの「不正行為」とコンパイラへの依存に加えて、コンパイラは標準ライブラリに存在する非標準関数にも依存する場合があります。そのため、すべての標準機能を実装したとしても、例外テーブルのウォーク、仮想デストラクタでの階層の処理などのルーチンをコピー アンド ペーストする必要があります。

于 2011-09-11T23:24:34.847 に答える
5

コンパイラが必要とするすべての「マジック」タイプは、「言語サポート ライブラリ」と呼ばれる C++ 仕様の独自のセクションにリストされています。明らかに、C++ 標準ライブラリを実装している場合は、標準のコピーを手元に用意しておく必要があります。初期化リストはそのセクションにありtype_info<cstdint>、 、グローバル演算子の new/delete 、<exception>などもあります。

これらを実装しようとしないでください。コンパイラが提供するものを使用してください。

于 2011-09-12T00:34:18.013 に答える