2012-01-18 20 views
6

Miré en el GCC STL (4.6.1) y vi que std::copy() usa una versión optimizada en caso de que __is_trivial() tenga true.optimizaciones std :: copy/memcpy/memmove

Dado que las plantillas std::copy() y std::reverse_copy() son muy útiles para copiar elementos en matrices, me gustaría usarlas. Sin embargo, tengo algunos tipos (que son resultados de instancias de plantillas) que son estructuras que contienen algunos valores triviales, sin punteros y no tienen un constructor de copias ni un operador de asignación.

¿Es G ++ lo suficientemente inteligente como para descubrir que mi tipo de hecho es trivial? ¿Hay alguna forma en C++ 98 para asegurarme de que una implementación de STL sepa que mi tipo es trivial?

Supongo que en C++ 11, las cosas serán convenientes usando el rasgo de tipo is_trivial<>. ¿Es esto correcto?

Gracias!

EDIT: Perdón por llegar tan tarde con esto, pero aquí hay un ejemplo de una clase Type bastante simple que no es trivial para GCC y llvm. ¿Algunas ideas?

#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 PODs forbit constructores por defecto también si recuerdo, que es probablemente lo que impide que sea trivial. –

+0

@MooingDuck: Gracias, creo que esa es la explicación. Junto con la respuesta de Mathieu, esto responde mi pregunta. – Manuel

Respuesta

5

Ha habido cierto debate sobre qué significaba trivial.

Por ejemplo, su ejemplo no es trivialmente construible por lo que puedo decir (std::is_trivially_default_constructible devolvería falso, creo).

En su caso, creo que necesitaría el nuevo rasgo std::is_trivially_copyable, que es de grano más fino. Entonces ... ¿actualizar tu compilador?

4

__is_trivial da el valor correcto para todos los tipos.

No se puede confiar en una implementación de STL particular para usarla, aunque si el proveedor del compilador la proporcionó, probablemente contenga varias mejoras específicas del compilador detrás de escena.

C++ 11 std::is_trivial simplemente está estandarizando esta característica, no hay razón para que una implementación no la use.

+0

Aparentemente, '__is_trivial' no puede deducir si un tipo es trivialmente copiable. :(Ver el ejemplo en mi actualización. – Manuel