"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > प्रदर्शन से समझौता किए बिना C++ में गो-स्टाइल डिफर कैसे प्राप्त करें?

प्रदर्शन से समझौता किए बिना C++ में गो-स्टाइल डिफर कैसे प्राप्त करें?

2024-11-16 को प्रकाशित
ब्राउज़ करें:623

How to Achieve Go-Style Defer in C   Without Sacrificing Performance?

सी में कार्यान्वयन को स्थगित करें

गो-स्टाइल डिफर की अवधारणा, जो स्वच्छ और संक्षिप्त संसाधन सफाई की अनुमति देती है, ने सी में लोकप्रियता हासिल की है . हालाँकि, इस सुविधा के लिए एक मानक या अच्छी तरह से समर्थित लाइब्रेरी कार्यान्वयन खोजना चुनौतीपूर्ण हो सकता है।

मानक टेम्पलेट लाइब्रेरी (एसटीएल) या बूस्ट में डिफर के लिए अंतर्निहित समर्थन की अनुपस्थिति के बावजूद, बाहरी कार्यान्वयन उपलब्ध हैं . ऐसा ही एक कार्यान्वयन एक हल्का, शून्य-ओवरहेड समाधान है:

#ifndef defer
struct defer_dummy {};
template  struct deferrer { F f; ~deferrer() { f(); } };
template  deferrer operator*(defer_dummy, F f) { return {f}; }
#define DEFER_(LINE) zz_defer##LINE
#define DEFER(LINE) DEFER_(LINE)
#define defer auto DEFER(__LINE__) = defer_dummy{} *[&]()
#endif // defer

इस कार्यान्वयन के लिए न्यूनतम सेटअप की आवश्यकता होती है और इसे आसानी से आपके कोडबेस में एकीकृत किया जा सकता है। वाक्यविन्यास सीधा है:

defer { statements; };

उदाहरण के लिए, निम्नलिखित कोड स्निपेट में, जब read_entire_file फ़ंक्शन का दायरा बाहर निकल जाता है तो fclose ऑपरेशन स्वचालित रूप से निष्पादित होता है:

auto file = std::fopen(filename, "rb");
if (!file)
    return false;

defer { std::fclose(file); }; // don't need to write an RAII file wrapper.

// ...

यह शून्य-ओवरहेड कार्यान्वयन सी में संसाधन सफाई को प्रबंधित करने का एक सुविधाजनक और कुशल तरीका प्रदान करता है, जो जटिल आरएआईआई कक्षाओं या कस्टम मेमोरी प्रबंधन तकनीकों की आवश्यकता के बिना गो-जैसी डिफर सुविधा प्रदान करता है।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3