auf VC++ 2012 wählen Compiler automatisch Aufruf Konvertierung für staatenlos lambdas (das hat keine Capture-Variablen) wenn Sie "stateless Lambda Funktionszeiger" umwandeln.
MSDN C++11 Features:
Lambdas
[...] Zusätzlich ist in Visual C++ in Visual Studio 2012, staatenlos lambdas umwandelbar sind Zeiger zu funktionieren. [...] (Das Visual C++ in Visual Studio 2012 ist sogar noch besser, weil wir statuslose Lambdas zu Funktionszeigern mit beliebigen Aufrufkonventionen umgewandelt haben. Dies ist wichtig, wenn Sie APIs verwenden, die Dinge wie die Funktion __stdcall
erwarten Zeiger)
EDITED.
NB: Die anrufende Umwandlung von C++ Norm ist, hängt es von anderen Spezifikationen wie Plattform ABI (Application binary Interface).
Die folgenden Antworten basieren auf dem Code der Ausgabemontage mit /FAs compiler option. So ist es nur eine Vermutung, und bitte fragen Sie Microsoft für weitere Details; P
Q1. Wie lautet die Aufrufkonvention einer C++ - Lambda-Funktion?
Q3. Wenn die Aufrufkonvention nicht definiert ist, wie wird der Stapelspeicherplatz nach dem Aufruf einer Lambda-Funktion korrekt wiederverwendet?
Zu allererst, C++ Lambda (-Ausdrucks) ist keine Funktion (noch Funktionszeiger), können Sie operator()
Lambda Objekt wie ein Aufruf normale Funktion aufrufen. Und Ausgabe Assembly-Code sagt, dass VC++ 2012 Lambda-Körper mit __thiscall
aufrufen Konvertierung generiert.
Q2. Wie Sie die Aufrufkonvention einer C++ - Lambda-Funktion angeben?
AFAIK, gibt es keine Möglichkeit. (Es kann nur __thiscall
sein)
Q4. Erzeugt der Compiler automatisch mehrere Versionen einer Lambda-Funktion? dh als der folgenden Pseudo-Code: [...]
Wahrscheinlich No. Die VC++ 2012 Lambda-Typ bietet nur eine Lambda-Körper-Implementierung (void operator()()
), bietet jedoch mehr „benutzerdefinierte Umwandlung zu funktionieren Zeiger "für jede Aufrufkonvertierung (Funktionszeiger Zeiger zurückgeben mit void (__fastcall*)(void)
, void (__stdcall*)(void)
und void (__cdecl*)(void)
Typ).
Hier ist ein Beispiel;
// input source code
auto lm = [](){ /*lambda-body*/ };
// reversed C++ code from VC++2012 output assembly code
class lambda_UNIQUE_HASH {
void __thiscall operator()() {
/* lambda-body */
}
// user-defined conversions
typedef void (__fastcall * fp_fastcall_t)();
typedef void (__stdcall * fp_stdcall_t)();
typedef void (__cdecl * fp_cdecl_t)();
operator fp_fastcall_t() { ... }
operator fp_stdcall_t() { ... }
operator fp_cdecl_t() { ... }
};
lambda_UNIQUE_HASH lm;
diese Frage Verknüpfung scheint nützlich: http://stackoverflow.com/questions/14169295/how-to-specify-vc11-lambda-calling-convention – jogojapan
'f1' wird mit' __stdcall' aber 'h1' wird mit' __cdecl'; wenn du die herum tauscht funktioniert es? – congusbongus
@Cong, Die Fehler sind normal und die OKs sind abnormal. – xmllmx