C++: Semántica de movimiento

Uso de std::move

¡Prueba gratis durante 10 días

nuestros 1267 cursos !

Prueba gratis Mostrar modalidades de suscripción
Vamos a analizar la función o plantilla Move que proporciona C++. Se trata, en realidad, de un conversor de tipo. Los ejemplos nos ayudarán a entender su funcionamiento y utilidad. Unos vectores y una función para ver su contenido será todo lo que necesitaremos.
05:15

Transcripción

La biblioteca de C++ proporciona una función plantilla denominada "move". El "move" estándar, funciona en realidad como un conversor de tipo. Se utiliza para decirle al compilador que use un objeto como si fuera un "rvalue", lo que significa que se puede mover. Aquí tengo una copia de "vector-test-01.cpp", hay unas cuantas cosas aquí. Tenemos una pequeña función "message" para mostrar un mensaje en la pantalla. También hay una pequeña función "display vector" para mostrar estos vectores. Aquí tengo definidos estos vectores "v1" y "v2". Muestro un mensaje que dice "v1" y muestro el vector y un mensaje que dice "v2" y muestro el vector. Cuando compilo y ejecuto esto puedes ver que en la consola aparece el tamaño del vector, que esta justo aquí. Después muestra el vector "uno, dos, tres, cuatro, cinco". Así que, "v1" es "uno, dos, tres, cuatro, cinco" y "v2" es "seis, siete, ocho, nueve, diez". Esto es importante porqué vamos a jugar un poco con ello. Por ejemplo, puedo mover "v1" a "v2". Lo puedo hacer así, puedo decir que "v2" es igual al "move" estándar "v1". Lo que hace esto es utilizar esta función plantilla de "move", que en realidad es más que sólo un conversor de tipo que unicamente dice "se puede mover esto". Sólo funciona si el valor se puede convertir en un "rvalue". Es el caso de "v1". El otro lado del signo sigue igual. Adonde se va a mover, tiene que admitir una copia de movimiento. En este caso "v2" lo hace. Así que seguimos adelante y copiamos todo esto y mostramos todo lo que tenemos ahí abajo para que podamos ver como era antes y después del "move". Antes del "move" teníamos "v1" con cinco elementos "uno, dos, tres, cuatro, cinco", "v2" tiene cinco elementos "seis, siete, ocho, nueve, diez". Después del "move", "v1" está vacío y "v2" tiene el contenido que estaba en "v1". De esta forma los contenidos de "v1" se han copiado sin que haya habido una copia. Se han movido ha "v2", y "v1" se ha dejado vacío sin ningún contenido. Si no hubiese tenido aquí este "move" y hubiese dicho que "v2" es igual a "v1", se habría copiado. Voy a compilarlo y ejecutarlo y podrás ver que ambos vectores ahora son idénticos y que se han copiado todos los datos. Sin embargo, con el "move" "v1" se queda vacío, "v2" tiene el contenido de "v1" y no ha habido ninguna copia. Este "move" estándar también se puede utilizar para crear una función de intercambio. Voy a teclear esto aquí. Va a ser una plantilla. Voy a teclearlo en vez de usar aquí un atajo. Vamos a usar nuestra función "message" para mostrar que estamos en esta función de aquí. Tecleamos "swap" y después hacemos el "move". Creamos un objeto temporal y movemos el contenido de "a" al objeto temporal. Después movemos "b" a "a" y volvemos a mover el valor temporal a "b". De esta forma el objeto temporal se destruye. Por supuesto, después de quedar fuera de ámbito. Ahora tenemos una función de "swap". Aquí, puedo poner "swap". En realidad aquí no necesito esto por lo qué puedo intercambiar "v1" y "v2". Ahora compilo y ejecuto. Verás que "v1" ahora tiene "seis, siete, ocho, nueve, diez" y que "v2" tiene "uno, dos, tres, cuatro, cinco". Esto se ha conseguido sin ninguna copia, sólo mezclando las cosas un poco. Moviéndolas sin copiarlas. Puedes ver que aquí pone "swap". Es así porqué en realidad está llamando a mi función "swap". Hay una función "swap" en el espacio estándar de nombres que viene con la biblioteca estándar. Si aquí pongo estándar y compilo y ejecuto verás que obtenemos el mismo resultado, "seis, siete, ocho, nueve, diez" en "v1" y "uno, dos, tres, cuatro, cinco" en "v2". Pero aquí no vemos la palabra "swap" porque no estamos llamando a nuestra función "swap" en el espacio principal de "main". En su lugar estamos llamando a la función "swap" estándar, en el espacio estándar. Sólo quería enseñarte como se hace con el "move". Que fácil es hacer una función incluso con una función plantilla y que no se utiliza ninguna operación de copia. Se hace todo con la semántica de movimiento. Las plantillas estándar de "move" y "swap" son unas herramientas fundamentales para usar con la semántica de movimiento. Las vas a utilizar mucho cuando trabajes con la semántica de movimiento en el resto de este curso. Y por supuesto, en tu propio código.

C++: Semántica de movimiento

Profundiza en C++ con la semántica de movimiento, lo que permite optimizar la transferencia de datos, un componente fundamental de la gestión de recursos en C++.

28 min (8 Videos)
Actualmente no hay comentarios.
 
Software:
Fecha de publicación:13/12/2016

Este curso video2brain está disponible como descarga y para ser visualizado online. ¡Pero no hace falta que decidas entre las dos opciones! Al comprar el curso, disfrutarás de ambas posibilidades.

La descarga te permite ver las lecciones sin estar conectado/a a internet y supone una navegación fácil y ágil entre capítulo y capítulo. Si vas a trabajar en diferentes ordenadores o si no quieres descargarte el curso completo, entra en la web con tus datos de acceso y disfruta directamente de tus vídeos online. Te deseamos que disfrutes de este curso y te resulte de mucha utilidad.

Estamos a tu disposición si tienes cualquier tipo de duda o pregunta.