Ich habe in mehreren Beispielen gesehen, dass Sie ein einzelnes Zeichen verwenden können, um mehrere Variablen wie die folgenden zu erfassen:
%Vor% Dies führt dazu, dass rect
und point
per Referenz abgerufen werden und Sie auch Zugriff auf this
erhalten, aber wie viel wird es tatsächlich erfasst? Erfasst es nur die Variablen, die es benötigt, oder erfasst es buchstäblich alles, was es im aktuellen Bereich gibt?
Ich habe in anderen Beispielen gesehen, dass Sie auch einzelne Variablen angeben können, die so erfasst werden sollen:
%Vor% Gibt es einen Vorteil, es auf die eine oder andere Weise zu tun? Jemand, mit dem ich gearbeitet habe, hat einmal erwähnt, dass die Verwendung der "capture all" [&]
-Version teurer ist, aber ich kann keine Dokumentation finden, die das unterstützt. Ich möchte nur sicher wissen, dass ich Code nicht komplexer mache, als es sein muss, oder teure Dinge tue, die ich nicht tun sollte.
Laut Ссылка ist die Aufnahmeliste (der Teil in den quadratischen Klammern):
eine durch Kommas getrennte Liste mit null oder mehr Captures, optional beginnend mit einem Capture-Standard. Capture-Liste kann wie folgt übergeben werden [...]:
[a, & amp; b] wobei a durch Wert erfasst wird und b durch Referenz erfasst wird.
[this] erfasst den this-Zeiger nach Wert
[& amp;] erfasst alle automatischen Variablen odr, die im Körper von verwendet werden das Lambda als Referenz
[=] erfasst alle automatischen Variablen, die odr-used sind im Körper des Lambda nach Wert
[] erfasst nichts
Dies bedeutet, dass nur die im Körper des Lambda verwendeten automatischen (Scope-Lifetime) Variablen erfasst werden.
Ich kann nicht verstehen, warum das Erfassen von allem mit [&]
teurer ist als das von einzelnen Captures, aber ein Vorteil des expliziten Aufzeichnens der Captures ist, dass es keine Chance gibt etwas einzufangen, was Sie nicht erwartet haben.
Auf der anderen Seite könnte das Capturen mit [=]
teuer werden, da es Kopien von allem macht. Vielleicht hat sich das auf Ihren Kollegen bezogen.
Dies endet damit, dass Sie rect und per Referenz auswählen und Ihnen auch Zugriff darauf geben, aber wie viel wird es tatsächlich erfasst?
Wenn Sie mit [&]
erfassen, erfasst es alle Variablen im Rumpf des Lambda, die automatische Speicherdauer haben und odr-used sind.
Hier ist ein Beispiel:
%Vor%Wenn Sie wissen, dass Sie nur eine Variable erfassen, müssen Sie nicht alles nach Wert / Referenz erfassen.
Aber andererseits, wenn Sie wissen, dass Sie einige Variablen erfassen werden, ist es einfacher, sie mit [&]
oder [=]
zu erfassen, als sie alle zu schreiben.
Tags und Links c++ lambda c++11 performance