2012-09-06 25 views
7

Tengo tres preguntas con respecto al canje, lo más probable es que sea bastante básico para usted.Preguntas sobre el rendimiento del canje

(1) Con respecto a dos mismos contenedores tipo STL a y b, tanto las operaciones por debajo trabajarían

swap(a,b); 
a.swap(b); 

entiendo que la segunda está especializada para el recipiente (por ejemplo, sólo implica una serie de iterador swaps) mientras que el primero es un algoritmo global destinado a trabajar con tipos de datos genéricos y realiza una construcción de copia interna.

Mi pregunta es si escribo la primera, ¿usará el compilador el segundo independientemente, o tengo que tener cuidado de verificar si existe una especialización adecuada?

(2) ¿swap(a,b) daría el mismo resultado con swap(b,a)? Si una construcción de copia está involucrada y los objetos son de un tamaño considerablemente diferente, sospecho que puede ser importante.

(3) En los casos donde el operador sobrecargado == existe y es relativamente rápido, la verificación de a == b antes del intercambio tendría sentido para evitar operaciones innecesarias. ¿El std::swap aplica este control primero o realiza la operación independientemente?

¡Gracias por su tiempo!

Respuesta

7
  1. La plantilla global swap está especializada para cada uno de los tipos de biblioteca estándar que soporta swap; la especialización llama al miembro swap.

  2. No debería haber diferencia entre swap(a, b) y swap(b, a). (Puedo imaginar tipos perversos donde importaría, pero eso nunca ocurriría en la práctica).

  3. No, std::swap normalmente no se comprueba la igualdad. En muchos casos, eso sería más lento que solo hacer el intercambio.

+0

¿No todo esto depende de la implementación específica del STL? No creo que puedas derivar nada de esto del estándar. –

+1

El número 3 podría depender de la implementación. 1 es explícitamente requerido. –

+0

Muchas gracias por la pronta respuesta. – Chrys