2012-01-18 14 views
6

Ho esaminato il GCC STL (4.6.1) e ho visto che std::copy() utilizza una versione ottimizzata nel caso in cui l'__is_trivial() integrato sia true.std :: copy/memcpy/memmove ottimizzazioni

Poiché i modelli std::copy() e std::reverse_copy() sono molto utili per copiare elementi negli array, mi piacerebbe usarli. Tuttavia, ho alcuni tipi (che sono i risultati delle istanze dei modelli) che sono strutture che contengono alcuni valori banali, nessun puntatore e nessun costruttore di copia o operatore di assegnazione.

G ++ è abbastanza intelligente da capire che il mio tipo di fatto è banale? C'è un modo in C++ 98 per assicurarsi che un'implementazione STL sappia che il mio tipo è banale?

Immagino che in C++ 11 le cose diventeranno convenienti usando il tratto di tipo is_trivial<>. È giusto?

Grazie!

EDIT: Ci scusiamo per essere così tardi con questo, ma ecco un esempio di una semplice classe Type che non è banale per GCC e llvm. Qualche idea?

#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 I costruttori di default forbit POD anche se ricordo, che è probabilmente ciò che impedisce che sia banale. –

+0

@MooingDuck: Grazie, penso che sia la spiegazione. Insieme alla risposta di Mathieu, questo risponde alla mia domanda. – Manuel

risposta

5

C'è stato un po 'di dibattito su ciò che significava trivial.

Ad esempio, il tuo esempio non è banalmente costruibile per quanto posso dire (penso che std::is_trivially_default_constructible restituisca false).

Nel tuo caso, penso che sarebbe necessario il nuovo tratto std::is_trivially_copyable, che è più a grana fine. Quindi ... aggiorna il tuo compilatore?

4

__is_trivial fornisce il valore giusto per tutti i tipi.

Non è possibile fare affidamento su alcuna implementazione STL paticolare per utilizzarlo, sebbene se il fornitore del compilatore lo abbia fornito, probabilmente conterrà vari miglioramenti specifici del compilatore dietro le quinte.

C++ 11's std::is_trivial sta semplicemente standardizzando questa funzione, non c'è motivo per un'implementazione di non usarlo.

+0

Apparentemente, '__is_trivial' non può dedurre se un tipo è banalmente copiato. :(Vedi l'esempio nel mio aggiornamento. – Manuel