C++: Semántica de movimiento

Otras consideraciones en semántica de movimiento

¡Prueba gratis durante 10 días

nuestros 1202 cursos !

Prueba gratis Mostrar modalidades de suscripción
De la regla del tres a la regla del cinco, pasando por la del cuatro y medio. Te contamos qué tienes que tener en cuenta al implementar la semántica de movimiento en tus clases y qué errores no debes cometer.
04:07

Transcripción

Hay un par de cosas que tienes que tener en cuenta al implementar la semántica de movimiento en tus clases. La regla del tres es una regla generalmente aceptada en C++, que dice que si defines cualquiera de estas tres funciones miembro en tu clase un destructor, un constructor de copia o un operador de asignación de copia tienes que definir las tres. Por supuesto, las tres tienen versiones por defecto generadas por el compilador. Pero la lógica dice que si necesitas definir una de ellas probablemente la versión por defecto no será suficiente para ninguna de las tres. Siento realistas si estás definiendo alguna de estas funciones eso quiere decir que estás manejando datos. Por lo tanto, la versión por defecto de cualquiera de estas funciones probablemente no vaya a gestionar tus datos de forma correcta. Con la semántica de movimiento la regla del tres se convierte en la regla del cinco. La razón en este caso es realmente la misma. Pero con el añadido de las versiones del movimiento, del constructor y del operador de asignación. Si vas a implementar la técnica de copia e intercambio será una función miembro la que gestione tanto tu asignación de copia como la asignación de movimiento. Por eso algunas personas bromean diciendo que la regla del cinco se convierte en la regla del cuatro o del cuatro y medio, pero eso no es muy habitual. La realidad es que con un operador de asignación de copia e intercambio el objeto sigue proporcionando ambas funciones. Al trabajar con la semántica de movimiento tendrás que entender dónde se pueden aplicar las operaciones de movimiento y dónde no. Aquí tengo una copia de "rational-04.cpp", extraída de los archivos de ejercicios. Nos vamos a "main". Voy a borrar todo esto y a crear un ejemplo sencillo. Primero voy a definir un "rational" con 5,3 como parámetros. Esto es un "rational a" y un "rational b". Vamos a mover "a" a "b", después sacamos ambos por pantalla. Compilo y ejecuto. Puedes ver que tenemos una llamada a un constructor de movimiento porque estamos moviendo "a" a "b". "a" se queda vacío, "b" tiene cinco partido por tres. Llevamos a un par de destructores al final del ámbito. La primera extensión importante es que no puedes mover un objeto cualificado como constante. Por eso, si aquí pongo una constante y compilo y ejecuto, verás que ahora utilizo el constructor de copia. Por desgracia, no da un error al intentar mover un objeto cualificado como constante. Lo que tienes que recordar es que el "move" es en realidad un conversor. Por eso hace un "rvalue". Pero en este caso lo que hace es un "rvalue" cualificado como constante que tampoco se puede mover. Así que el compilador sólo selecciona el mejor constructor, que en este caso será el constructor de copia y hace su trabajo sin meter ruido. Es importante recordar que no puedes mover un objeto cualificado como constante y que "move" no es una función, si no que es un conversor. Así que no hace ninguna comprobación de error. El compilador sigue en silencio, trabajando lo mejor que puede. Lo que normalmente significa utilizar el constructor de copia. Lo más importante es que el valor, en realidad no se mueve. Verás que tanto "a" como "b" tienen valores dentro. Mientras que sin esta constante se utiliza el constructor de movimiento, y "a" se queda vacía, que era lo que estabas esperando. Así que el compilador normalmente elige bien qué va mejor con tu método de asignación de constructor. Intentará hacer lo que tenga más sentido, aunque eso no sea siempre lo que estabas esperando. Es importante que compruebes tus suposiciones y comprendas que no todo se puede mover.

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.