Saltar al contenido

¿Qué es std :: move () y cuándo debería usarse?

Solución:

Página de Wikipedia sobre referencias de valor R de C ++ 11 y constructores de movimiento

  1. En C ++ 11, además de los constructores de copia, los objetos pueden tener constructores de movimiento.
    (Y además de los operadores de asignación de copias, tienen operadores de asignación de movimientos).
  2. Se utiliza el constructor de movimiento en lugar del constructor de copia, si el objeto tiene el tipo “rvalue-reference” (Type &&).
  3. std::move() es una conversión que produce una referencia rvalue a un objeto, para permitir moverse desde él.

Es una nueva forma de C ++ para evitar copias. Por ejemplo, usando un constructor de movimiento, un std::vector podría simplemente copiar su puntero interno a los datos en el nuevo objeto, dejando el objeto movido en un estado de movido, por lo tanto no copiando todos los datos. Esto sería válido para C ++.

Intente buscar en Google la semántica de movimiento, rvalue, reenvío perfecto.

1. “¿Qué es?”

Tiempo std::move() es técnicamente una función – yo diría no es De Verdad Una función. Es una especie de convertidor entre las formas en que el compilador considera el valor de una expresión.

2. “¿Qué hace?”

Lo primero a tener en cuenta es que std::move() en realidad no mueve nada. Cambia una expresión de un valor l (como una variable con nombre) a un valor x. Un xvalue le dice al compilador:

Me puedes saquear, moverse cualquier cosa que tenga y usarla en otro lugar (ya que de todos modos me van a destruir pronto) “.

en otras palabras, cuando usas std::move(x), estás permitiendo que el compilador canibalice x. Así que si x tiene, digamos, su propio búfer en la memoria, después de std::move()ing el compilador puede tener otro objeto en su lugar.

También puede pasar de un prvalue (como un temporal que está pasando), pero esto rara vez es útil.

3. “¿Cuándo se debe utilizar?”

Otra forma de hacer esta pregunta es “¿Para qué canibalizaría los recursos de un objeto existente?” bueno, si estás escribiendo código de aplicación, probablemente no estarías jugando mucho con los objetos temporales creados por el compilador. Por lo tanto, principalmente haría esto en lugares como constructores, métodos de operador, funciones similares a algoritmos de biblioteca estándar, etc., donde los objetos se crean y destruyen automágicamente mucho. Por supuesto, eso es solo una regla general.

Un uso típico es “mover” recursos de un objeto a otro en lugar de copiarlos. @Guillaume enlaza a esta página que tiene un ejemplo breve y sencillo: intercambiar dos objetos con menos copias.

template <class T>
swap(T& a, T& b) {
    T tmp(a);   // we now have two copies of a
    a = b;      // we now have two copies of b (+ discarded a copy of a)
    b = tmp;    // we now have two copies of tmp (+ discarded a copy of b)
}

el uso de move te permite intercambiar los recursos en lugar de copiarlos:

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

Piensa en lo que pasa cuando T es decir, vector<int> de tamaño n. En la primera versión, lee y escribe 3 * n elementos, en la segunda versión básicamente lee y escribe solo los 3 punteros a los búferes de los vectores, más los 3 tamaños de búfer. Por supuesto, clase T necesita saber cómo hacer la mudanza; su clase debe tener un operador de asignación de movimiento y un constructor de movimiento para la clase T para que esto funcione.

Puede usar move cuando necesite “transferir” el contenido de un objeto a otro lugar, sin hacer una copia (es decir, el contenido no está duplicado, por eso podría usarse en algunos objetos no copiables, como un unique_ptr). También es posible que un objeto tome el contenido de un objeto temporal sin hacer una copia (y ahorrar mucho tiempo), con std :: move.

Este enlace realmente me ayudó:

http://thbecker.net/articles/rvalue_references/section_01.html

Lo siento si mi respuesta llega demasiado tarde, pero también estaba buscando un buen enlace para std :: move, y encontré los enlaces de arriba un poco “austeros”.

Esto pone el énfasis en la referencia del valor r, en qué contexto debe usarlos, y creo que es más detallado, por eso quería compartir este enlace aquí.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *