7

GCC STL(4.6.1)を調べたところ、ビルトインがに評価されstd::copy()た場合に最適化されたバージョンを使用していることがわかりました。__is_trivial()true

std::copy()とテンプレートは配列内の要素をコピーするのに非常に便利なので、std::reverse_copy()それらを使用したいと思います。ただし、いくつかの些細な値を含み、ポインターを含まず、コピーコンストラクターまたは代入演算子を持たない構造体であるいくつかのタイプ(テンプレートのインスタンス化の結果)があります。

G ++は、私のタイプが実際には些細なものであることを理解するのに十分賢いですか?C ++ 98で、STL実装が私の型が取るに足らないことを認識していることを確認する方法はありますか?

is_trivial<>C ++ 11では、タイプ特性を使用すると便利になると思います。これは正しいですか?

ありがとう!

編集:これに遅れて申し訳ありませんが、これはTypeGCCとllvmにとって簡単ではない非常に単純なクラスの例です。何か案は?

#include <iostream>

struct Spec;

template <typename TValue, typename TSpec>
class Type
{
public:
    TValue value;

    Type() : value(0) {}
};

int main()
{
    std::cerr << "__is_trivial(...) == "
              << __is_trivial(Type<char, Spec>) << '\n';                                                                                                                                                                                                                                    
    return 0;
} 
4

2 に答える 2

5

trivialを意味するのかについていくつかの議論がありました。

たとえば、あなたの例は、私が知る限り、自明に構築することはできません(std::is_trivially_default_constructiblefalseを返すと思います)。

std::is_trivially_copyableあなたの場合、よりきめの細かい新しい特性が必要になると思います。だから...あなたのコンパイラをアップグレードしますか?

于 2012-01-18T16:58:13.973 に答える
4

__is_trivialすべてのタイプに適切な値を与えます。

特定のSTL実装に依存して使用することはできませんが、コンパイラベンダーが提供した場合は、コンパイラ固有のさまざまな改善が舞台裏で含まれている可能性があります。

C ++ 11std::is_trivialはこの機能を標準化しているだけであり、実装で使用しない理由はありません。

于 2012-01-18T16:33:47.280 に答える