2012-01-18 8 views
6

GCC STL(4.6.1)を調べて、がtrueと評価された場合、std::copy()は最適化バージョンを使用することがわかりました。std :: copy/memcpy/memmoveの最適化

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

G ++は、私のタイプが実際に些細なものであることを理解するのに十分ですか? C++ 98では、STLの実装が私の型が自明であることを知るための方法はありますか?

私はC++ 11では、タイプの形質がis_trivial<>で便利になると思います。これは正しいですか?

ありがとうございます!

EDIT:GCCとllvmにとって些細なことではない、かなり簡単なTypeクラスの例です。何か案は?

#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; 
} 
+3

C++ 03私が思い出したように、PODもデフォルトのコンストラクタをforbitしていますが、これはおそらくそれが些細なことであることを防ぐものです。 –

+0

@MooingDuck:ありがとう、私はそれが説明だと思う。マチューの答えと一緒に、私の質問に答えます。 – Manuel

答えて

5

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

たとえば、あなたの例は私が言うことができる限り、自明に構成可能ではありません(std::is_trivially_default_constructibleは私が考えると間違っています)。

あなたのケースでは、私はあなたがより細かい粒度の新しい形質std::is_trivially_copyableを必要とすると思います。だから...あなたのコンパイラをアップグレードしますか?

4

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

コンパイラのベンダーが提供していれば、STLの実装に頼ることはできませんが、コンパイラ固有のさまざまな改良がシーンの中に含まれているようです。

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

+0

明らかに、 '__is_trivial'は型が単純にコピー可能かどうかを推論することはできません。 :(私の更新の例を見てください。 – Manuel