2011-11-29 11 views
6

Estoy usando el código "boost :: call_traits :: param_type" en una máquina win32 program @ windows 7. Para mi sorpresa, no es "doble" sino "const double &".por qué boost :: call_traits <double> :: param_type es "const double &", mientras que no es "doble"

Pensé que todos los tipos primitivos son buenos para usar "pasar por valor" para los parámetros de función, ¿no es eso un sentido común? Porque muchas personas usarían is_pod para determinar el uso de referencia o no, ¿no es así?

Respuesta

-1

boost::call_traits plantilla de clase no se ha especializado para double. La plantilla de clase principal devuelve const T &, por eso es const double &, en lugar de double, aunque no importa mucho en este caso, pero sí importa si T es un tipo de clase, que tiene enormes miembros de datos. Para evitar una copia innecesaria, es referencia constante.

4

Esa optimización aparentemente solo se aplica a los tipos incorporados "pequeños", según el doc.

De un vistazo rápido al source, parece que los tipos "pequeños" se consideran como aquellos que satisfacen sizeof(T) <= sizeof(void *). En una máquina de 32 bits, obviamente no incluye double.

En algunos casos, puede también ser mejor para pasar parámetros como double en lugar de double const&, pero como siempre, usted tendría que hacer el seguimiento y la prueba ...

Cuestiones relacionadas