जैसा कि आप एक एम्बेडेड वातावरण में काम कर रहे हैं, आप संभवतः अत्यंत न्यूनतम समाधान का पक्ष लेते हैं और आप अपने कंपाइलर के बारे में गैर-मानक या गैर-पोर्टेबल तथ्यों का लाभ उठा सकते हैं।
यदि कोई कक्षा सी ++ में पॉलिमॉर्फिक (कम से कम एक वर्चुअल फ़ंक्शन है) है, तो संभवतः इसमें कहीं भी एम्बेडेड एक vtable के लिए पॉइंटर होता है। यह हो सकता है कि vtable सूचक स्मृति में ऑब्जेक्ट के लेआउट की शुरुआत में प्रकट होता है।
यह कई कंपाइलरों के बारे में सच है, जो सी ++ एबीआई - a related SO question here का उपयोग करते हैं।
void *get_vtable(void *obj)
{
return *(reinterpret_cast<void **>(obj));
}
तो फिर तुम दो संकेत करने वाली वस्तुओं की vtables तुलना कर सकते हैं देखने के लिए अगर वे एक ही प्रकार को इंगित:
यदि हां, तो आप इस तरह vtable पर प्राप्त करने में सक्षम हो सकता है वस्तु का
तो एक "प्रकार स्विच" (जो है क्या मूल रूप से है पकड़) कुछ इस तरह करना होगा:
P p;
Q q;
if (get_vtable(caught) == get_vtable(&p))
{
// it's a P...
}
else if (get_vtable(caught) == get_vtable(&q))
{
// it's a Q...
}
आपको एक मैक्रो में उस पैटर्न को छिपाने सकता है।
महत्वपूर्ण बिंदु - यदि आप एक बेस से एक वर्ग निकाले जाते हैं, लेकिन व्युत्पन्न वर्ग किसी भी आभासी कार्यों पर हावी नहीं होता या किसी भी नए आभासी कार्यों को जोड़ने, तो संकलक क़यास आधार वर्ग के vtable व्युत्पन्न वर्ग के लिए पुन: उपयोग कर सकते हैं। इसका मतलब है कि दो अपवाद प्रकारों के बीच अंतर करने के लिए, प्रत्येक को वर्चुअल फ़ंक्शन को ओवरराइड करना होगा, यह सुनिश्चित करने के लिए कि उनके पास अपने स्वयं के vtables हैं।
ध्यान दें कि यह अपवाद हैंडलिंग में केवल एक छोटा सा अंश है। ढेर को अनदेखा करने का भी छोटा मामला है! जब आप हैंडलर पर कूदते हैं तो आपको ढेर पर सभी ऑब्जेक्ट्स के विनाशकों को कॉल करने की आवश्यकता होती है। यह सिर्फ setjmp/longjmp करने का मामला नहीं है।
स्रोत
2009-07-03 22:06:56
क्या आप कंपाइलर या भाषा रनटाइम लिख रहे/संशोधित कर रहे हैं, या आप इसे कहां फिट करने जा रहे हैं? थोड़ा और संदर्भ अच्छा होगा। – jalf
यदि आप स्मृति सीमित हैं, तो आपको आरटीटीआई सक्षम नहीं करना चाहिए, या यहां तक कि अपवादों का उपयोग करने का प्रयास नहीं करना चाहिए।एक वैकल्पिक दृष्टिकोण बेहतर सोचो। –
यदि कोई अपवाद फेंक दिया गया है, तो किसी भी तरह से फेंकने वाले नस्ट ने अपवाद प्रकार की जानकारी को एन्कोड किया है, इसलिए मैं नहीं देख सकता कि आपको कुछ "वैकल्पिक" विधि क्यों चाहिए। जैसे ही आधे ने कहा, हमें वास्तव में क्या करने की कोशिश कर रहे हैं, इस बारे में अधिक जानकारी दें। –