कुलपति ++ 2012 को संकलक राज्यविहीन lambdas के लिए स्वचालित रूप से बुला रूपांतरण (है कि कोई कब्जा वेरिएबल नहीं है) चुनें जब आप बदल "सूचक कार्य करने के लिए राज्यविहीन लैम्ब्डा"।
MSDN C++11 Features:
lambdas
[...] इसके अतिरिक्त विजुअल C++ विजुअल स्टूडियो 2012 में में, राज्यविहीन lambdas संकेत दिए गए कार्य करने के लिए परिवर्तनीय हैं। [...] (विजुअल स्टूडियो 2012 में विजुअल सी ++ इससे भी बेहतर है, क्योंकि हमने स्टेटसलेस लैम्ब्स को फ़ंक्शन पॉइंटर्स में परिवर्तनीय बना दिया है, जिसमें मनमाने ढंग से कॉलिंग कॉन्फ़्रेंस हैं। यह महत्वपूर्ण है जब आप एपीआई का उपयोग कर रहे हों जो __stdcall
फ़ंक्शन जैसी चीजों की अपेक्षा करते हैं संकेत)
संपादित:।
एनबी: बुला रूपांतरण सी ++ स्टैंडर्ड से बाहर है, यह इस तरह मंच ABI (आवेदन द्विआधारी इंटरफेस के रूप में अन्य विनिर्देश पर निर्भर करता है)।
निम्नलिखित जवाब /FAs compiler option साथ उत्पादन विधानसभा कोड पर आधारित हैं। तो यह एक मात्र अनुमान है, और कृपया अधिक विवरण के लिए माइक्रोसॉफ्ट पूछना; पी
Q1। सी ++ लैम्ब्डा फ़ंक्शन का कॉलिंग सम्मेलन क्या है?
क्यू 3। यदि कॉलिंग सम्मेलन को परिभाषित नहीं किया गया है, तो लैम्ब्डा फ़ंक्शन कहने के बाद स्टैक स्पेस को सही तरीके से रीसायकल कैसे करें?
सबसे पहले, सी ++ लैम्ब्डा (-expression) एक समारोह (और न ही समारोह सूचक) नहीं है, तो आप एक फोन करने की तरह सामान्य कार्य लैम्ब्डा वस्तु को operator()
कॉल कर सकते हैं। और उत्पादन विधानसभा कोड का कहना है कि कुलपति ++ 2012 __thiscall
बुला रूपांतरण के साथ उत्पन्न लैम्ब्डा शरीर।
प्रश्न 2। सी ++ लैम्ब्डा फ़ंक्शन के कॉलिंग सम्मेलन को कैसे निर्दिष्ट करें?
AFAIK, वहाँ कोई रास्ता नहीं है। (यह केवल __thiscall
हो सकता है)
Q4। क्या संकलक स्वचालित रूप से लैम्ब्डा फ़ंक्शन के कई संस्करण उत्पन्न करता है? यानी निम्नलिखित छद्म कोड के रूप में: [...]
शायद नहीं। कुलपति ++ 2012 लैम्ब्डा प्रकार केवल एक लैम्ब्डा शरीर कार्यान्वयन (void operator()()
) प्रदान करता है, लेकिन कई प्रदान करता है "उपयोगकर्ता परिभाषित रूपांतरण कार्य करने के लिए प्रत्येक बुला रूपांतरण (void (__fastcall*)(void)
, void (__stdcall*)(void)
, और void (__cdecl*)(void)
प्रकार के साथ ऑपरेटर वापसी समारोह सूचक) के लिए सूचक "।
यहाँ एक उदाहरण है;
// 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;
इस प्रश्न को जोड़ने से उपयोगी लगता है: http://stackoverflow.com/questions/14169295/how-to-specify-vc11-lambda-calling-convention – jogojapan
'f1'' __stdcall' का उपयोग कर रहा है लेकिन 'h1'' __cdecl'; यदि आप आसपास के लोगों को स्वैप करते हैं तो यह काम करता है? – congusbongus
@Cong, त्रुटियों सामान्य हैं और OKs असामान्य हैं। – xmllmx