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?
Respuesta
Tu pregunta es muy general. Tal vez pueda empezar:
- Ignorar las funciones
std:move()
ystd::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;
(conMatrix a,b,c,d;
) - implemento mismo
operator+
enMatrix
con sobrecarga RValue Referencias. - debe ser capaz de reducir el número de temporarios en gran medida.
- En código C++ 03, cuentan las temperaturas de
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 unoImage
). - Con
move
en elreturn
puede decirle al compilador, que no necesitaii
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.
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.
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
@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 –
- 1. ¿Cuál es el código de C++ más difícil de entender que conoces?
- 2. ¿Es demasiado difícil un proyecto? ¿Qué haces?
- 3. Entender lo que SPARQL es
- 4. es 'absoluto' más rápido que Move()?
- 5. Preguntas de la entrevista: ¿Es difícil de entender?
- 6. C# Potencial Pregunta de entrevista ... ¿Demasiado difícil?
- 7. difícil de entender print_r/var_dump para el objeto
- 8. ¿Es Google Guava "más difícil" de usar que Apache Collections?
- 9. ¿Es realmente necesario poner el std :: move dentro de un lambda?
- 10. Explicar regex que encuentra comentarios de CSS
- 11. WPF: ¿Se supone que soy un diseñador?
- 12. std :: move entre std :: string y std :: vector <unsigned char>
- 13. cuadrados ayuda para entender que marchan algoritmo
- 14. OpenGL demasiado difícil para mí, ¿hay alguna alternativa?
- 15. ¿Por qué copiar elision no funciona con std :: move?
- 16. ¿Es difícil personalizar el administrador de Django?
- 17. ¿Cuán difícil es el multihilo de Haskell?
- 18. Modelado "Soy * pero también soy **"
- 19. ¿Está regresando con `std :: move` sensible en el caso de declaraciones de devolución múltiples?
- 20. Encuentra los números que faltan
- 21. La diferencia entre el tipo de fundición y el uso de std :: move()?
- 22. Me parece que no puede entender esto NET cosa firma
- 23. ¿Es esta prueba HTML para futuros asistentes de posgrado demasiado difícil?
- 24. ¿Cuánto de STL es demasiado?
- 25. Groovy dice que mi cadena Unicode es demasiado larga
- 26. ¿Debo usar std :: move o std :: forward en movimiento ctors/operadores de asignación?
- 27. Visualizar gráfico no dirigido que es demasiado grande para GraphViz?
- 28. Quiero que la tarea maneje las excepciones que se lanzan, pero me es difícil evitar que lleguen a la matriz
- 29. Tricky problema de programación que tengo problemas para entender
- 30. ¿Soy solo yo? Creo que LINQ to XML es algo engorroso, en comparación con XPath
Afortunadamente, tienes unos 10 años más para tratar de comprenderlos antes de que se estandaricen. –
¿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. –
@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). –