2013-10-13 3 views
8

मैंने हाल ही में पाया है कि {} ब्लॉक का उपयोग स्वयं किया जा सकता है। मेरे लिए, यह वास्तव में पठनीयता उदाहरण के लिए कुछ मामलों में, निम्न कोड में सहायता की जा सकती है:क्या सी ++ ब्लॉक {} का नकारात्मक प्रभाव

push(); 
{ 
    foo(); 
    push(); 
    { 
     foo(); 
     foo(); 
    } 
    pop(); 
} 
pop(); 
एक तरफ शैली से अधिक व्यक्तिपरक राय से

:

push(); 
foo(); 
push(); 
foo(); 
foo(); 
pop(); 
pop(); 

(आईडीई ऑटो खरोज लड़ के बिना) बन सकता है , क्या इसका कोई नकारात्मक प्रभाव पड़ता है (जैसे कंपाइलर से कम अनुकूलन, उनके पास एक और उपयोग है, आदि) या इन ब्लॉक उपयोग करने के लिए सुरक्षित हैं।

+3

वे एक दायरे को परिभाषित करते हैं, चाहे वह "नकारात्मक" हो या न कि आप उनका उपयोग कैसे करें। उदाहरण के लिए: गुंजाइश बंद होने से पहले बनाई गई वस्तुओं को नष्ट कर दिया जाएगा, इसलिए जब तक आप वास्तव में इस व्यवहार की आवश्यकता नहीं रखते हैं, तो इसे नकारात्मक परिणाम माना जा सकता है। –

+3

वे आरएआईआई के लिए उपयोगी हैं। –

+0

@ एंडोनएम। कोलमैन धन्यवाद, वास्तव में अंतर्दृष्टि ... अधिक जानकारी के लिए Google होगा। – Ross

उत्तर

10

आपके दूसरे उदाहरण के बारे में सबकुछ 100% ठीक है। अतिरिक्त ब्लॉक उनके भीतर घोषित चर के दायरे को प्रभावित कर सकते हैं, लेकिन आप इनमें से कोई भी नहीं कर रहे हैं।

12

जब वे कोड का अर्थ नहीं बदलते हैं (जैसा कि आपके उदाहरण में है), तो इसका कोई कारण नहीं है कि उन्हें अनुकूलन पर कोई प्रभाव हो। यदि वे करते हैं, तो यह एक विशेष संकलक का एक quirk है।

लागू करने के लिए है कि अपने pop() कॉल अपने push() कॉल के नक्शे आप भी ऐसा कर सकता है:

struct Pusher { 
    Pusher() { push(); } 
    ~Pusher() { pop(); } 
}; 

...

{ 
    Pusher p1; 
    foo(); 
    { 
     Pusher p2; 
     foo(); 
     foo(); 
    } 
} 

पैटर्न आम तौर पर आरए II कहा जाता है। यह कोड का अर्थ बदलता है, हालांकि - मेरे कोड pop() में कॉल किया जाएगा यदि foo() पर कोई भी कॉल अपवाद फेंकता है, तो यह आपके नहीं होगा। अधिकांश (लेकिन सभी नहीं) स्थितियों में जहां आपको लौटने से पहले कुछ पूर्ववत करने की आवश्यकता होती है, आपको अपवाद को पूर्ववत करने की भी आवश्यकता होती है।

3

इस तरह के ब्लॉक बनाने से नए स्कोप्स बनते हैं। इस प्रकार आपके पास इन स्कॉप्स में प्रवेश और बाहर निकलने पर चलने वाले रचनाकार और विनाशक होंगे। एक दूसरे को छिपाने के लिए नामों के लिए आपके पास और भी संभावनाएं होंगी। वे उपयोग करने के लिए सुरक्षित हैं लेकिन आपको इन चीजों को ध्यान में रखना होगा।

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

RAII style programming के साथ संयोजन में जीवनकाल को नियंत्रित करने के लिए एक चीज स्कॉप्स उपयोगी हैं। इस उदाहरण में एक म्यूटेक्स आयोजित होने की अवधि को सीमित करने के लिए एक गुंजाइश का उपयोग किया जाता है।

int a = b + c; 
{ 
    OS::Mutex::Lock lock(mutex); 
    some_shared_variable = a; 
} 

यहाँ Lock एक आरए II शैली वर्ग कि निर्माता और नाशक में यह विज्ञप्ति में एक म्युटेक्स प्राप्त है। स्पष्ट रूप से एक दायरे का उपयोग करके आप सीमित कर सकते हैं कि लॉक कितनी देर तक आयोजित किया जा रहा है।

+0

पुन: पठनीयता, यह सच है लेकिन मैंने बहुत खुश हूं। आपके उत्तर और दूसरों से, एक टन सीखा गया है :) – Ross

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