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;
}
C++ 03 I costruttori di default forbit POD anche se ricordo, che è probabilmente ciò che impedisce che sia banale. –
@MooingDuck: Grazie, penso che sia la spiegazione. Insieme alla risposta di Mathieu, questo risponde alla mia domanda. – Manuel