2010-11-12 16 views
5

He estado leyendo acerca de std::move, std::forward, rvalues, lvalues ​​y así sucesivamente en SO y en otros lugares. Pero me parece que no puedo entenderlo. Aunque a veces me meto en arreglos, creo que entiendo cosas básicas sobre punteros, referencias, etc. que estaban en C++ antes de todo esto. ¿Soy yo o estas cosas son demasiado pesadas?¿Soy el único que encuentra que std :: move es demasiado difícil de entender?

+2

Afortunadamente, tienes unos 10 años más para tratar de comprenderlos antes de que se estandaricen. –

+0

¿Qué no puedes entender exactamente? Por supuesto, los valores pueden ser un poco confusos al principio, pero los otros son bastante sencillos. Por supuesto, puede usar punteros y referencias directamente si lo desea, pero pueden ser objeto de abuso y mal uso, lo que puede ocasionar problemas que a veces pueden ser difíciles de diagnosticar. Las bibliotecas estándar tienen como objetivo ayudarlo a escribir código más seguro y correcto al permitir más validaciones en tiempo de compilación que de otro modo no podría tener. –

+4

@Travis: No realmente. C++ 0x debería estar estandarizado el próximo año y algunas implementaciones del compilador ya los soportan (es decir, Visual C++ y g ++, aunque otros ya los soportan también). –

Respuesta

1

Tu pregunta es muy general. Tal vez pueda empezar:

  • Ignorar las funciones std:move() y std::forward() al principio
  • Un aspecto de RValue Referencias es salvar los temporales.
    • En código C++ 03, cuentan las temperaturas de Matrix z = a + b + c + d; (con Matrix a,b,c,d;)
    • implemento mismo operator+ en Matrix con sobrecarga RValue Referencias.
    • debe ser capaz de reducir el número de temporarios en gran medida.

Si desea ver un simple uso de std::move(): Ayuda al compilador para evitar la introducción de una copia de un valor de retorno:

  • hacer una clase de contenedores como Image - costosa para copiar .
  • No se olvide de poner en práctica el movimiento y copia asignar
  • inventar una función fábrica que funciona así:

     
    Image load_matching_size(const char *fn_small, const char *fn_big) { 
        pair<Image> ii = load_2_images(fn_small, fn_big); 
        return ii.first.width() >= 64 ? ii.first : ii.second; 
    } 
    
  • Se puede contar el número de elementos temporales? Tenga en cuenta que el return necesitará uno adicional y ¡cópielo! (El ejemplo está diseñado para que optimización del valor de retorno ("RVO") no sea posible)

  • ¿Ve usted que esto no sería necesario? Las imágenes en ii se descartarán después de que se devuelva la función. ¿Podría el compilador usar entonces para el valor de retorno? (No, no podría. RVO funcionaría si solo tuviéramos uno Image).
  • Con move en el return puede decirle al compilador, que no necesita ii más y que puede usarlo para la devolución. Y ahorre una copia costosa usando el move-c'tor en lugar del copy-c'tor para la devolución.
7

Yo recomendaría la lectura de la propuesta original, si no lo ha hecho:

A Proposal to Add Move Semantics Support to the C++ Language

Se establece muy claramente los problemas que se pueden resolver con referencias rvalue y mover la semántica y cómo Las referencias de valores y la semántica de movimientos se pueden usar para resolver esos problemas.

Los documentos del comité de normas a menudo son densos y difíciles de entender, pero este es bastante accesible y vale la pena leerlo. Las referencias rvalue y la semántica de movimiento especificadas en el estándar final C++ 0x (siempre que eso suceda) pueden ser diferentes de las propuestas en este documento, pero los conceptos siguen siendo los mismos.

+0

No, no lo he leído aún por exactamente la misma razón que usted ha indicado. Encuentro documentos oficiales demasiado difíciles de filtrar. Por eso un sitio como este es tan bueno. Pero lo probaré :(. – nakiya

+0

@nakiya: No dudes en publicar aquí con cualquier pregunta (o maldecirme en un comentario si no encuentras ese papel útil). El documento es técnico, pero de un nivel lo suficientemente alto como para que sea legible –

Cuestiones relacionadas