अंतिम अद्यतन:2026-10-12
C++ Pimpl इडियम¶
“implementation की ओर इशारा करने वाला पॉइंटर” या “pImpl” एक C++ प्रोग्रामिंग तकनीक है, जो क्लास के कार्यान्वयन विवरणों को ऑब्जेक्ट की अभिव्यक्ति से हटाकर एक अलग क्लास में रखती है, और उस तक एक अपारदर्शी पॉइंटर से पहुँच दी जाती है।
pImpl इडियम के उपयोग के कारण इस प्रकार हैं:
निम्नलिखित उदाहरण पर विचार करें:
pImpl रूप में बदलने पर यह नीचे जैसा हो जाता है
CPP परिभाषा:
- बाइनरी संगतता (binary compatibility)
लाइब्रेरी विकसित करते समय, क्लाइंट के साथ बाइनरी संगतता तोड़े बिना XImpl में फ़ील्ड जोड़े/संशोधित किए जा सकते हैं (अन्यथा क्रैश हो जाएगा!)। चूँकि Ximpl क्लास में नया फ़ील्ड जोड़ने पर X क्लास का बाइनरी लेआउट नहीं बदलता, इसलिए लाइब्रेरी में नई कार्यक्षमता गौण (minor) संस्करण अपडेट में सुरक्षित रूप से जोड़ी जा सकती है।
बेशक, आप बाइनरी संगतता तोड़े बिना X / XImpl में नए public/private गैर-वर्चुअल मेथड भी जोड़ सकते हैं, परंतु यह मानक हेडर/कार्यान्वयन तकनीक जितना ही है।
- डेटा छिपाना (data hiding)
यदि आप कोई लाइब्रेरी विकसित कर रहे हैं — विशेषतः स्वामित्व वाली (proprietary) — तो हो सकता है कि आप लाइब्रेरी के public इंटरफ़ेस को कार्यान्वित करने में प्रयुक्त अन्य लाइब्रेरी/तकनीकों को उजागर न करना चाहें। कारण या तो बौद्धिक संपदा (IP) की चिंता है, या यह कि आप मानते हैं कि उपयोगकर्ता कार्यान्वयन के बारे में जोखिम भरे धारणाएँ बना सकते हैं, या केवल डरावने कास्टिंग ट्रिक्स से encapsulation तोड़ सकते हैं। PIMPL इस समस्या का समाधान/शमन करता है।
- संकलन समय (compilation time)
संकलन समय घट जाता है, क्योंकि जब आप XImpl क्लास में फ़ील्ड और/या मेथड जोड़ते/हटाते हैं (जो मानक तकनीक में केवल private फ़ील्ड/मेथड जोड़ने जैसा है), तब केवल X की सोर्स (कार्यान्वयन) फ़ाइल का पुनर्निर्माण करना पड़ता है। व्यवहार में यह एक सामान्य ऑपरेशन है।
मानक हेडर/कार्यान्वयन तकनीक (PIMPL के बिना) में, जब आप X में नया फ़ील्ड जोड़ते हैं, तो हर वह क्लाइंट जिसने कभी X आवंटित (स्टैक या हीप पर) किया था, उसे पुनः संकलित होना पड़ता है, क्योंकि उसे आवंटन का आकार समायोजित करना होता है। और हाँ, जिस क्लाइंट ने कभी X आवंटित ही नहीं किया, उसे भी पुनः संकलित होना पड़ता है, पर वह केवल ओवरहेड है (क्लाइंट पर परिणामी कोड वही रहता है)।
https://stackoverflow.com/questions/8972588/is-the-pimpl-idiom-really-used-in-practices
संबंधित विषय¶
- C++ डिफ़ॉल्ट कंस्ट्रक्टर से बचना | C++那些事
- C++ क्लास इनिशियलाइज़र लिस्ट इडियम | C++那些事
- C++ में फ़ंक्शन टेम्पलेट की जगह क्लास टेम्पलेट | C++那些事
- C++ copy-and-swap इडियम | C++那些事
- C++ डिपेंडेंसी इंजेक्शन | C++那些事
- C++ enum class स्ट्रॉन्ग टाइप्ड एनम | C++那些事
- C++ Header-Only तथा कार्यान्वयन का पृथक्करण | C++那些事
- C++ लेज़ी इवैल्यूएशन इडियम | C++那些事
- C++ लुकअप टेबल इडियम | C++那些事
- C++ मेंबर पॉइंटर तथा टाइप जानकारी | C++那些事