Ich habe ein interessantes Problem mit C++ Lambdas. Der Use Case ist ein performance-kritischer Thread, der ein Lambda mit nicht-leerem Closure erstellt, das dann an einen anderen Thread übergeben wird, damit es "bearbeitet" werden kann.Platzierung neu für Lambda Capture
Die allgemeine Idee funktioniert, aber meine Lambda Schließung Objekt wird eine zusätzliche Zeit kopiert und Compiler (derzeit g ++ 5.4.0) ist nicht in der Lage, diese Kopie einschließlich Kopie Elision weg optimieren. Ich habe auch versucht, mit ähnlichem Ergebnis zu klirren.
Im Idealfall würde Ich mag eine Platzierung neu verwenden, wenn Lambda Erstellung direkt in den dauerhaften Speicherobjekte anstelle von ersten Erstellen von Objekt auf Stapel zum Beispiel:
auto l = new (buf) [a,b,c](){}
Der Fehler ist so etwas wie:
lambda_ctor.cpp:39:19: error: expected type-specifier before '[' token
auto al = (buf) new [a,b,c](){};
Ich dachte, vielleicht, wenn ich einen Typ in der Hand anstelle von tatsächlichen Lambda-Ausdruck hatte, sollte Compiler es akzeptieren, aber zu versuchen, Art der Schließung zu heben, ohne es zu bewerten läuft in ein anderes Problem:
using T = decltype([a,b,c](){});
mit diesem Fehler:
lambda_ctor.cpp:41:24: error: lambda-expression in unevaluated context
using T = decltype([a,b,c](){});
ich nicht einen Weg zu finden, um diese scheinen kann, gibt es eine Reihe von Ideen, wie am Umfang Ausgang Lambda halten von zerfall aber jede Lösung scheint zu beinhalten Kopieren/Verschieben des Closure-Objekts, nachdem es erstellt wurde (auch als Extra-Kopie bezeichnet). Dies ist ein wenig seltsam, da wir normalerweise die volle Kontrolle darüber haben, wie ein benutzerdefinierter Funktor erstellt und weitergegeben wird und ähnliche Regeln für Closures gelten sollten.
verwandt/Betrogene: http://stackoverflow.com/questions/37924996/c11-lambda-with-dynamic-storage-duration – NathanOliver
Warum nicht eine aufrufbare Struktur machen (functor)? – Galik
Verwenden Sie 'std :: function' als Lambda-Container – fnc12