In che modo le espressioni/chiusure Lambda in C++ 0x complicano la gestione della memoria in C++? Perché alcune persone dicono che le chiusure non hanno posto nelle lingue con gestione manuale della memoria? La loro richiesta è valida e se sì, quali sono le ragioni alla base?Lambda Expressions and Memory Management
risposta
Lambdas può sopravvivere al contesto in cui sono stati creati. Associare variabili libere per riferimento può essere un problema, quindi, quando i lambda vogliono accedervi in seguito, potrebbero non esistere più. È semplicemente "Non restituire variabili locali per riferimento" sotto mentite spoglie.
Tali argomenti sono una falsa pista. Sì, lambda ha problemi di gestione della memoria da affrontare, ma un lambda è fondamentalmente come un oggetto funzione (functor) con variabili membro. Qualunque problema debba affrontare un funtore, anche un lambda deve occuparsene. I lambda C++ 0x hanno le strutture per decidere quali oggetti catturare e se dovrebbe essere per valore o per riferimento. Questo è analogo alla memorizzazione di valori e riferimenti in un oggetto funtore.
In che modo le espressioni Lambda/Chiusure in C++ 0x complicano la gestione della memoria in C++?
Fanno? Sono solo zucchero sintattico per la creazione di oggetti funzionali. Niente che non abbiamo mai visto prima. Solo ora abbiamo una sintassi breve per la creazione di quelli al volo.
Perché alcuni dicono che le chiusure non hanno posto nelle lingue con gestione manuale della memoria?
Probabilmente dovresti chiedere loro. Trovo l'approccio lambda C++ 0x piuttosto elegante e di basso livello. Si adatta allo spirito del C++.
C'è una richiesta valida e se sì, quali sono le motivazioni alla base?
Mi batte. Ti va di carpire qualche argomento tu stesso?
- 1. Lambda Capture and Memory Management
- 2. Objective C Structs and Memory Management
- 3. Lambda Expressions
- 4. Combine Lambda Expressions
- 5. GroupBy in lambda expressions
- 6. Java Lambda expressions
- 7. Java 8 refactoring lambda expressions
- 8. Lambda Expressions in modelli T4
- 9. jersey security and session management
- 10. Utilizzo di alberi Lambda Expressions con IEnumerable
- 11. multipla clausole Where in Lambda Expressions
- 12. In C# ci sono oggetti Lambda Expressions?
- 13. Expressions vs Lambdas
- 14. Utilizzo di GroupBy, Count e Sum in LINQ Lambda Expressions
- 15. Utilizzando GroupBy e Max in LINQ Lambda Expressions
- 16. Quali sono i vantaggi di Lambda Expressions per sistemi multicore?
- 17. C# Expressions - FatalExecutionEngineError
- 18. AWS Lambda Hot and Cold Start
- 19. C# ToDictionary lambda select index and element?
- 20. Parse XPath Expressions
- 21. Come compongo Linq Expressions esistenti
- 22. Esiste una leggera inesattezza con l'attuale documento Apple su Advanced Memory Management?
- 23. Qualcuno ha ancora effettuato il backport delle Lambda Expressions su Java 7?
- 24. Il modo migliore per passare un elenco di nomi di proprietà come Lambda Expressions
- 25. ElasticSearch Out Of Memory
- 26. PFQueryTableView Memory
- 27. Memory Sanitizer
- 28. PostgreSQL COPY FROM STDIN Expressions
- 29. ATmega328 + SPI Flash Memory
- 30. Memory Data Register (MDR) vs Memory Buffer Register (MBR)
Penso che sia _functor_ o _function object_ (e non _functor object_), ma avete comunque il mio voto. – sbi
Grazie @sbi. L'ho modificato per dire cosa intendevo. –
Il problema è che i lambdas sono meno espliciti nella loro cattura, specialmente se si utilizza il modulo generico "cattura tutto per riferimento": [&]. Quando costruisci un functor, devi passare esplicitamente le variabili "catturate". Ma è vero che lambda è una variabile locale e come tale non dovrebbe essere permesso di sfuggire al suo ambito, proprio come qualsiasi altra variabile locale. –