0

テンプレート パラメーター T を持つクラスがあります。クラスの一部の関数は、型 T のパラメーターを取得します。最大速度を達成するには、T が組み込み型の場合は値で渡し、他の型では const 参照で渡します。ケース。これはいくつかのテンプレート メタ プログラミングで達成できることはわかっていますが、標準 C++ ライブラリ (C++11 も歓迎) で、(コンパイル時に) それをサポートする、または実装を容易にする何らかの機能を探しています。 .

T が組み込み型の場合は get_type が T であり、T がそれ以外の場合は get_type が const T& である、次のようなコードを書きたいと思います。

template <typename T> void foo(get_type<T> a);

PS: Loki ( http://loki-lib.sourceforge.net/ ) に関数があることは知っていますが、コードを外部ライブラリに依存させたくありません。

4

2 に答える 2

2

標準 C++ ライブラリには何もありませんが、必要なことを行うものはboost::call_traits::param_typeあります。

于 2013-09-09T09:14:27.107 に答える
1

実行速度は組み込み型であることに依存しないと思います。コンパイルされたコードのアセンブラー出力を調べたところ、スタック上のコピーではなく、CPU レジスターを介してデータを渡すことができることが重要であると考えています。したがって、CPU アーキテクチャ、コンパイラ自体、および関数に必要なパラメーターの量に依存します。例として: avr のような 8 ビットの CPU があり、32 ビットの int 値を渡す場合、コンパイラは 4 を使用できます! レジスタまたはスタック フレームとそれへのポインタを使用できます。

私の経験から、物事を自動的にスピードアップするのに役立つ唯一の事実は、関数に渡さなければならないデータの量を調べることです。複数のレジスタが関係している場合は参照を渡すと便利です。それでも、アーキテクチャ、コンパイラ、およびコンパイラの設定にも依存します。

最初の試行では、単純にパラメーターのサイズを基準として取得することができます。サイズが n cpu レジスタよりも大きい場合は、参照渡し用にテンプレートを特殊化できます。これは、SFINAE と std::enable_if(sizeof(T)>x) を使用するだけで簡単に実行できます。

2 番目のチャンスとして、std::is_xxx を見ることができます。std::is_fundamental など、定義済みのテンプレートが多数あります。std::is_xxx のいずれかを組み合わせることができます。参照: http://en.cppreference.com/w/cpp/header/type_traits

于 2013-09-09T09:51:48.620 に答える