12

試行錯誤の結果、ある種のコンパイラマジック(TM)に依存するcertian C++ 11の機能があります。私は自分自身の標準準拠のstdlibを実装することに戸惑ってきました。私はstdlibの実装が容易に利用できることを知っていますが、これは小規模なアプリケーションのための私の個人的なバージョンのものです。コンパイラ固有のプロキシに依存するC++ 11のライブラリ機能

昨晩私はを仕様に基づいて実装していましたが、問題なく動作していましたが、それは不可能であるという声明だけを残して、 。さて、私は現在のlibstdc++の実装を見てみることにしました。私の実装はまったく同じ設計で、エッジの周りでわずかに異なっていました。実装がうまくいかなかった理由を突き止める無駄な時間を無駄にしました。 libstdc++のデザインとまったく同じです。私がそれが名前空間stdになければならなかったことに気づくまでに6時間もかからなかった。実装はコンパイラに対するプロキシであり、initializer_listを可能にし、コンパイラ自体はnamespace stdinitializer_listクラスを検索します。

私の知りたいことは、特別なコンパイラマジック、もっと隠されたプロキシ接続、または新しいC++ 11ライブラリ機能のコンパイラintristicsを分泌する必要があることです。 ? 私はコンパイラマジックに依存する他の機能を試してみると、試行錯誤で一日を浪費するのではなく、事前にこれらを知りたいと思います。退屈で迷惑になることがあります。

ありがとうございました。

+1

おそらくたくさんの魔法が... –

答えて

11

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

複数の<type_traits>プロパティクエリは、コンパイラの助けなしに実装することは不可能または非常に困難です。コンパイラのネイティブstdlibが "不正"のために成功した場合、難しいものでさえも機能しなくなる可能性があります。そしてもちろん、それらはより速くコンパイルされます。それは最初の使用時に自動的に初期化されている<iostream>ようにcinことやcout書くことは可能ですが

は、ほとんどのコンパイラは、カンニング、彼らは最初の静的初期化中であるように、それらをリンクすることを選択しました。

<typeinfo>はもちろん、コンパイラが期待するものと完全に一致している必要があります。

おそらく私が知らない、または考えられないことがもっとあります。

stdlibが "不正"であり、コンパイラに頼っているだけでなく、コンパイラはstdlibに存在する非標準機能に依存することもあります。したがって、すべての標準機能を実装しても、例外テーブルを歩くためのルーチンをコピーして貼り付ける必要があります。

+0

ヘッダーファイルで 'std :: function'がどのように動作するかを調べた後、私はそれも魔法であると考えています。 –

5

コンパイラが必要とするすべての「魔法」タイプは、 "Language support library"と呼ばれるC++仕様の独自の特別なセクションにリストされています。明らかに、C++標準ライブラリを実装している場合は、標準のコピーを用意する必要があります。イニシャライザのリストは、そのセクションにあり、type_info,<cstdint>、グローバル演算子new/delete、<exception>などがあります。

これらを実装しないでください。コンパイラがあなたに与えるものを使用します。

+0

''は、最高品質でない場合にはイントロスペクションで行うことができ、グローバル置換可能な新規/削除はプライベート名前空間と 'using'ディレクティブ(私は試していません)で行うことができます。しかし、ええ、その条項のほとんどが適用されます。 - oops、そのような 'new'は' :: operator new'と名前を付けることができませんでした。 – Potatoswatter

関連する問題