2015-10-30 12 views
6

क्या डिफ़ॉल्ट कैप्चर मोड का उपयोग करने में कोई ओवरहेड है?क्लोजर डिफ़ॉल्ट कैप्चर ओवरहेड

{ 
    Foo foo = ...; 
    Bar bar = ...; 
    [&]() 
    { 
     write(foo); 
    } 
} 

{ 
    Foo foo = ...; 
    Bar bar = ...; 
    [&foo]() 
    { 
     write(foo); 
    } 
} 

स्पष्ट करने के लिए वहाँ पर कब्जा किया जा रहा है, भले ही इस्तेमाल नहीं किया बार पूर्व संबंधित का उपयोग करने में किसी भी कीमत है?

+4

जब आप "लागत" कहते हैं, तो इसका मतलब क्या है? भंडारण? निष्पादन समय? संकलन समय? कुछ और? –

+0

@ जोचिमपिलबोर्ग मेरा मतलब है कि अगर पहले मामले में –

+3

में अधिक संग्रहण की तरह कोई रन-टाइम लागत है तो कोई कीमत नहीं है। केवल वे चर जो आप वास्तव में * उपयोग * पहले मामले में कब्जा कर लिया जाता है। – jalf

उत्तर

3

यह अनिर्दिष्ट कैसे संदर्भ द्वारा कब्जा कर लिया संस्थाओं के साथ लैम्ब्डा सौदों, मसौदे से सी ++ 14 मानक (N4140) अनुभाग 5.1.2 [expr.prim.lambda] है:

एक इकाई है संदर्भ द्वारा कब्जा कर लिया गया है अगर यह स्पष्ट रूप से या स्पष्ट रूप से पर कब्जा कर लिया गया है लेकिन कॉपी द्वारा कब्जा नहीं किया गया है। यह निर्दिष्ट नहीं है कि अतिरिक्त अज्ञात गैर स्थैतिक डेटा सदस्यों को संदर्भ द्वारा कैप्चर की गई संस्थाओं के लिए बंद प्रकार में घोषित किया गया है। एक गुमनाम संघ के एक सदस्य संदर्भ

यह शब्दों जानबूझकर कार्यान्वयन इस के आसपास अनुकूलन करने के लिए अनुमति देने के लिए खुला छोड़ दिया गया था द्वारा कब्जा कर लिया नहीं किया जाएगा, defect report 750: Implementation constraints on reference-only closure objects जो संदर्भ देता N2927 जो कहते देखें:

नए शब्दों अब "संदर्भ द्वारा" कैप्चर के लिए किसी भी पुनर्लेखन या बंद करने वाले सदस्यों को निर्दिष्ट नहीं करता है। "संदर्भ द्वारा" कब्जे वाले इकाइयों का उपयोग मूल संस्थाओं को प्रभावित करता है, और इसे प्राप्त करने के लिए तंत्र पूरी तरह कार्यान्वयन के लिए छोड़ दिया गया है।

2

N3337 5.1.2/15 या N4527 (सी ++ 14 अंतिम मसौदा) 5.1.2/16

एक इकाई संदर्भ द्वारा कब्जा कर लिया है अगर यह परोक्ष या स्पष्ट है पर कब्जा कर लिया लेकिन प्रतिलिपि द्वारा कब्जा कर लिया नहीं । यह निर्दिष्ट नहीं है कि अतिरिक्त अज्ञात गैर-स्थैतिक डेटा सदस्यों को संदर्भ द्वारा कैप्चर की गई संस्थाओं के लिए बंद प्रकार में घोषित किया गया है।

+1

नोट 'N3337' सी ++ 11 के सबसे नज़दीकी मसौदा है जबकि' N4140' सी ++ 14 के निकटतम मसौदा है जो ओपी ने प्रश्न को टैग किया है। हम अपने उत्तर से देख सकते हैं कि 'N4140' उद्धरण अलग है, हालांकि अंतर इस सवाल को प्रभावित नहीं करता है। ऐसे कई मामले हैं जहां सी ++ 11 बनाम सी ++ 14 के लिए उत्तर अलग है। जबकि 'N4527' वर्तमान में उपलब्ध नवीनतम वर्किंग ड्राफ्ट मूल रूप से सी ++ 1z है। –

संबंधित मुद्दे