のは、私は、次のメタ関数を持っているとしましょう:キャッシュメタ関数によってコンパイル時のパフォーマンスの最適化
template <typename T>
struct make_pair {
using type = std::pair<
typename std::remove_reference<T>::type,
typename std::remove_reference<T>::type
>;
};
それはこの(または他の何か)を行うためにコンパイル速度を改善する代わりに?
template <typename T>
struct make_pair {
using without_reference = typename std::remove_reference<T>::type;
using type = std::pair<without_reference, without_reference>;
};
は、私は2つの可能性を参照してください。
コンパイラはいくつかの仕事にそれが
typename std::remove_reference<T>::type
見たびに行う必要があります。中間エイリアスを使用すると、コンパイラーが何らかの作業を一度しか行うことができない、ある種の「キャッシング」動作があります。コンパイル時のパフォーマンスは、コンパイラが実行する必要があるテンプレートのインスタンシエーションの数によって測定されます。
std::remove_reference<T>::type
はstd::remove_reference<T>::type
と同じ型を参照するため、両方の場合に必要なテンプレートインスタンシエーションは1つだけなので、どちらの実装も同等のWRTコンパイル時のパフォーマンスです。
私はBが正しいと思いますが、私は確信しています。答えがコンパイラ特有のものであると判明した場合、私は主にClangとGCCの答えを知ることに興味があります。
編集:
私はで動作するようにいくつかのデータを持っているテストプログラムのコンパイルをベンチマーク。テストプログラムは、そのようなことはない:
template <typename ...> struct result;
template <typename T>
struct with_cache {
using without_reference = typename std::remove_reference<T>::type;
using type = result<without_reference, ..., without_reference>;
};
template <typename T>
struct without_cache {
using type = result<
typename std::remove_reference<T>::type,
...,
typename std::remove_reference<T>::type
>;
{ };
using Result = with[out]_cache<int>::type;
これらはresult<>
で10個の000テンプレートパラメータを持つプログラムのコンパイル10、の平均時間です。
-------------------------
| g++ 4.8 | clang++ 3.2 |
-----------------------------------------
| with cache | 0.1628s | 0.3036s |
-----------------------------------------
| without cache | 0.1573s | 0.3785s |
-----------------------------------------
テストプログラムは、利用可能なスクリプトhereによって生成されます。
実際の計測に代わるものではないと思う。いくつかのタイミングの数字を投稿して、それを説明する素晴らしい理論を作成してください。 –
私は、リンクリストの代わりにテンプレートのインスタンス化のためにハッシュテーブルを作成するというclangの話を見ました。私は彼らが自分を誰と比較しているのか分かりません。 –
memoizationを行わない 'template'コンパイラは、非常に遅くなるでしょう。 – Yakk