3

現在、私はテンプレートに精通しており、SFINAE などにもある程度精通しています。テンプレートがコンパイラによってインスタンス化されるとどうなるか疑問に思っていました。

SFINAE や TMP の単純なフィボナッチ数列のようなものを TMP で実行すると、コンパイラはテンプレートのインスタンス化で私が理解している以上のことを行っているように見えます。コンパイラがテンプレート コードを実行しているようです。

私の質問は、テンプレートのインスタンス化とは正確には何ですか?実際にコードを実行するコンパイラで描かれた線はどこにあるのでしょうか?

コンパイラはテンプレートのタイプを作成します。これは、テンプレートのインスタンス化に関する私の理解です。しかし、TMP ではそれ以上のことが行われているようで、私は混乱しています。

4

1 に答える 1

3

これは関数の集まりと考えるのが最善です。これが実際の関数です。Typeここでは、型のコンパイラの内部表現を表すclass を考えてみましょう。

template<typename T> class X {
    T t;
};

ランタイム C++ では、これを次のように表現できます。

Type* X(Type *t) {
    static std::unordered_map<Type*, Type*> cache;
    if (cache.find(t) != cache.end())
        return cache[t];
    Type* ret = new Type;
    ret->DataMembers.insert("t", t);
    return cache[t] = ret;
}

もちろん、専門化などには少し余分に必要になります。ただし、このモデルを使用すると、次の 2 つのことが簡単になります。

A) テンプレートのインスタンス化は関数呼び出しと同等であり、コンパイル時にたまたま発生しますconstexpr。もちろん、賢いコンパイラは最適化として別のことをするかもしれませんが、それは一般的なケースです。

B) テンプレートによって提供される他の機能にどのように拡張するか。

テンプレートのインスタンス化はチューリング完全であるため、他の方法で実際に処理することはできません。コンパイラがそれらを実行しているように見える理由、 . それらは、不適切な構文を持つ限定された EDSL の関数にすぎません。

于 2012-05-09T00:31:45.437 に答える