C++ साक्षात्कार कैसे पास करें: उन्नत स्तर के शीर्ष प्रश्न

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C++ साक्षात्कार कैसे पास करें: उन्नत स्तर के शीर्ष प्रश्न

\n\n

C++ डेवलपर पद के लिए साक्षात्कार हमेशा एक चुनौती होता है। यदि आप बुनियादी प्रश्नों (new और malloc के बीच अंतर, वर्चुअल डिस्ट्रक्टर क्या है) को शायद जानते हैं, तो उन्नत स्तर के लिए भाषा की आंतरिक संरचना की गहरी समझ की आवश्यकता होती है। इस लेख में, हम उन प्रमुख विषयों पर चर्चा करेंगे जो मिडिल और सीनियर पदों के लिए तकनीकी साक्षात्कार में निश्चित रूप से सामने आएंगे। हम केवल प्रश्नों को सूचीबद्ध नहीं करेंगे, बल्कि कोड उदाहरणों के साथ विस्तृत उत्तर भी देंगे।

\n\n

1. स्मार्ट पॉइंटर्स और उनकी आंतरिक संरचना

\n\n

प्रश्न: "बताएं, std::unique_ptr, std::shared_ptr से कैसे अलग है? रेफरेंस काउंटर की थ्रेड-सुरक्षा कैसे कार्यान्वित की जाती है?"

\n\n

यह एक क्लासिक प्रश्न है। साक्षात्कारकर्ता यह देखना चाहता है कि आप न केवल सिंटैक्स बल्कि संसाधन स्वामित्व की सिमैंटिक्स भी समझते हैं।

\n\n
    \n
  • std::unique_ptr — अनन्य स्वामित्व। कॉपी नहीं किया जाता, केवल स्थानांतरित किया जाता है। उन संसाधनों के लिए आदर्श जिनका एक मालिक है।
  • \n
  • std::shared_ptr — साझा स्वामित्व। रेफरेंस काउंटर (कंट्रोल ब्लॉक) का उपयोग करता है। जब काउंटर शून्य हो जाता है, संसाधन नष्ट हो जाता है।
  • \n
  • std::weak_ptr — "पर्यवेक्षक"। रेफरेंस काउंटर को नहीं बढ़ाता। shared_ptr में चक्रीय निर्भरताओं को तोड़ने के लिए उपयोग किया जाता है।
  • \n
\n\n

उन्नत बारीकी: shared_ptr में रेफरेंस काउंटर थ्रेड-सुरक्षित है (परमाणु संचालन का उपयोग किया जाता है), लेकिन यह प्रबंधित ऑब्जेक्ट को थ्रेड-सुरक्षित नहीं बनाता है। दो काउंटर भी होते हैं: मजबूत संदर्भ (strong) और कमजोर संदर्भ (weak)। जब तक कम से कम एक कमजोर संदर्भ मौजूद है, कंट्रोल ब्लॉक हटाया नहीं जाता, भले ही ऑब्जेक्ट पहले ही नष्ट हो चुका हो।

\n\n
#include <memory>\n#include <iostream>\n\nclass Resource {\npublic:\n    Resource() { std::cout << "Resource acquired\\n"; }\n    ~Resource() { std::cout << "Resource destroyed\\n"; }\n    void doWork() { std::cout << "Working...\\n"; }\n};\n\nint main() {\n    std::unique_ptr<Resource> uptr = std::make_unique<Resource>();\n    uptr->doWork();\n    // std::unique_ptr<Resource> uptr2 = uptr; // संकलन त्रुटि!\n    std::unique_ptr<Resource> uptr2 = std::move(uptr); // ठीक है\n\n    std::shared_ptr<Resource> sptr1 = std::make_shared<Resource>();\n    std::shared_ptr<Resource> sptr2 = sptr1; // रेफरेंस काउंटर = 2\n    sptr1.reset(); // काउंटर = 1\n    sptr2.reset(); // काउंटर = 0, ऑब्जेक्ट नष्ट हो गया\n    return 0;\n}
\n\n

2. वर्चुअल टेबल (vtable) और लेट बाइंडिंग तंत्र

\n\n

प्रश्न: "मेमोरी स्तर पर वर्चुअल फंक्शन कैसे काम करता है? vtable कहाँ संग्रहीत होता है?"

\n\n

यह प्रश्न न केवल पॉलीमॉर्फिज्म बल्कि C++ में मेमोरी संरचना की समझ की जाँच करता है।

\n\n
    \n
  • प्रत्येक वर्ग के लिए जिसमें कम से कम एक वर्चुअल फंक्शन है, कंपाइलर एक स्थिर तालिका (vtable) बनाता है। इसमें वर्चुअल फंक्शन के पॉइंटर्स होते हैं।
  • \n
  • ऐसे वर्ग की प्रत्येक वस्तु में एक छिपा हुआ पॉइंटर __vptr होता है, जो अपने वर्ग की vtable की ओर इशारा करता है।
  • \n
  • पॉइंटर या रेफरेंस के माध्यम से वर्चुअल फंक्शन को कॉल करते समय, कंपाइलर कोड उत्पन्न करता है जो __vptr से vtable में जाता है, ऑफसेट द्वारा आवश्यक फंक्शन ढूंढता है और उसे कॉल करता है।
  • \n
  • vtable स्थिर मेमोरी (ग्लोबल वेरिएबल की तरह) में संग्रहीत होता है, स्टैक या हीप में नहीं।
  • \n
\n\n

उन्नत बारीकी: एकाधिक वंशानुक्रम (multiple inheritance) के साथ जटिलताएँ। इस मामले में, एक वस्तु में कई __vptr हो सकते हैं, और thunk-फंक्शन (पॉइंटर this का सुधार) की आवश्यकता उत्पन्न होती है। यह उन कारणों में से एक है जिसके कारण C++ में एकाधिक वंशानुक्रम को खतरनाक और धीमा माना जाता है।

\n\n
#include <iostream>\n\nclass Base {\npublic:\n    virtual void foo() { std::cout << "Base::foo\\n"; }\n    virtual ~Base() = def                

ब्लॉग

पुस्तक अनुशंसाएँ