Warum funktioniert eine lambda haben eine Größe von 1 byte?

Arbeite ich mit der Erinnerung an einige Lambda-Ausdrücke in C++, aber ich bin ein bisschen verwirrt durch Ihre Größe.

Hier ist mein test-code:

#include <iostream>
#include <string>

int main()
{
  auto f = [](){ return 17; };
  std::cout << f() << std::endl;
  std::cout << &f << std::endl;
  std::cout << sizeof(f) << std::endl;
}

Können Sie es hier: http://fiddle.jyt.io/github/b13f682d1237eb69ebdc60728bb52598

Der Ausgang ist:

17
0x7d90ba8f626f
1

Dies deutet darauf hin, dass die Größe der meine lambda 1 ist.

  • Wie ist das möglich?

  • Sollte nicht die lambda sein, also mindestens einen Zeiger auf seine Umsetzung?

  • seine, implementiert als eine Funktion Objekt (ein struct mit einem operator())
  • Und eine leere struct kann nicht sein, Größe 0, daher die 1 Folge. Versuchen Sie erfassen etwas, und sehen, was passiert mit der Größe.
  • Warum sollte ein lambda-Ausdruck ein Zeiger??? Es ist ein Objekt, das einen Aufruf der operators.
  • Lambda-Ausdrücke in C++ existiert zur compile-Zeit, und Anrufungen verbunden sind (oder sogar eingebettet) zur compile oder link-Zeit. Es gibt daher keine Notwendigkeit für eine Laufzeit Zeiger in das Objekt selbst. @KerrekSB Es ist nicht eine unnatürliche denke, zu erwarten, dass ein lambda-Ausdruck enthält eine Funktion Zeiger, da die meisten Sprachen, die zur Umsetzung von lambdas sind dynamischer als C++.
  • Das ist eine ziemlich vage Aussage. Ein lambda-Ausdruck ist ein Ausdruck, und der Ausdruck ist, existiert tatsächlich zur compile-Zeit, aber was zählt, ist der Wert, den Sie erhalten, die aus der Bewertung, der Ausdruck, das ist der Verschluss-Objekt, und existiert zur Laufzeit. Auswertung eines Ausdrucks geschieht (als-ob) zur Laufzeit (außer für Konstante Ausdrücke).
  • Angelegenheiten" - in welchem Sinne? Der Grund für die Schließung-Objekt kann leer sein (anstatt mit einem function pointer) ist, da die Funktion aufgerufen werden, ist bekannt zur compile - /link-Zeit. Dies ist, was die OP scheint missverstanden haben. Ich sehe nicht, wie Sie Ihre Kommentare klären sich die Dinge.

InformationsquelleAutor sdgfsdh | 2016-05-27
Schreibe einen Kommentar