sirve - swap vector c++



¿Qué tan rápido es std:: swap para tipos enteros? (2)

STL implementa una función genérica std::swap para intercambiar 2 valores. Se puede presentar de la siguiente manera:

template <class T> void swap (T& a, T& b)
{
  T c(std::move(a));
  a=std::move(b);
  b=std::move(c);
}

Sin embargo, hay un algoritmo de intercambio XOR para intercambiar 2 enteros ( http://en.wikipedia.org/wiki/XOR_swap_algorithm ):

void swap_u( size_t& x, size_t& y )
{
   x = x^y;
   y = x^y;
   x = x^y;
}

Mis preguntas:

  1. ¿Es una optimización hoy en día (en x86 o arm )?
  2. ¿El estándar de C ++ favorece este tipo de optimización?
  3. ¿Existe alguna implementación real de STL en la naturaleza que tenga la especialización std::swap para enteros?

https://code.i-harness.com


El intercambio XOR es realmente solo un truco y puede fallar en ciertos casos (por ejemplo, ambas variables son referencias al mismo objeto).

El intercambio XOR tampoco es particularmente eficiente ya que tiene dependencias en serie, por lo que siempre tomará al menos tres ciclos de instrucción. El uso de un intercambio directo con un temporal tiene menos dependencias, lo que permite cierto paralelismo en las CPU superescalares modernas. En algunas CPU puede incluso implementarse en una instrucción, pero incluso sin instrucciones especiales, puede ejecutarse en dos ciclos.


En X86, un intercambio de XOR triple entre ubicaciones de memoria (no registros de CPU) toma los mismos ciclos de procesador que una copia triple. Pueden ser incluso menos si lo temporal es un registro.





swap