3

私はコラージュの割り当てのために汎用ライブラリ クラスに取り組んでいます。コードができるだけ効率的に実行されることが非常に重要です。

double や int などの基本型である場合、配列を初期化するために必要な次のコードがあります。

T b[dim];
if(std::is_fundemental::<T>::value) 
{ 
    memset(b, 0, dim*sizeof(T));
}

問題は、このチェックが実行時チェックを行わないように最適化されているかどうか、または基本型の特殊化を使用して初期化用のテンプレートを作成する必要があるかどうかです。

私は C++11 で G++ を使用していますが、ほとんどの、できればすべてのコンパイラでチェックなしで実行できるはずです。

4

3 に答える 3

6

標準は最適化に対応していませんが、この最適化を行わないコンパイラーは想像できません。しかし、それは本当に重要なことでしょうか: あなたが話しているのはせいぜい 1 つか 2 つの機械語命令であり、その後、さらに多くのことを行う関数を呼び出します。正式には、整数型以外は機能しません。(すべてのビットが 0 の double が 0.0 ではないマシンについて聞いたことがありません。)

しかし、FWIW:std::uninitialized_fill_nは少なくとも同じくらい高速である必要があり、ifすべてのタイプで機能するため、必要ありません。

于 2013-05-15T11:27:55.343 に答える
4

asm リストを有効にしてコンパイルし、各ケースでコンパイラが何をしたかを調べます。何が起こるかを確実に知る唯一の方法。

PS 異なるコンパイラは異なる結果を生成する可能性があります。しかし、あなたはすでにそれを知っていると思います。

于 2013-05-15T11:27:15.123 に答える
3

コンパイル時の定数を使用してコードを有効にするかどうかを指定する場合、特殊なテンプレート関数を使用し、SFINAE を使用して tamplate を有効にするかどうかを指定することもできます。これにより、必要な機能のみがコンパイル/リンクされることが保証されます。この機能は最適化とは無関係です。

次の例は、アイデアを提供します。

#include <iostream>
#include <type_traits>

using namespace std;


template <typename T>
void Do( T t, typename std::enable_if<std::is_integral<T>::value >::type* = 0)
{
    cout << "Is fundamental" << endl;
}

template <typename T>
void Do( T t, typename std::enable_if<std::is_integral<T>::value == false>::type* = 0)
{
    cout << "Is not fundamental" << endl;
}

class NonFuncdamental
{} nonFundamental;

int fundamental;

int main()
{
    Do( fundamental );
    Do( nonFundamental );
    return 0;
}
于 2013-05-15T11:30:37.473 に答える