2009-08-25 17 views
33

मानसिक रूप से, मैंने हमेशा सोचा है कि सी ++ संकलन इसे असेंबलर में अनुवाद करते समय दृश्यों के पीछे कैसे दिखें/फेंक/पकड़ते हैं। लेकिन चूंकि मैंने इसका कभी भी उपयोग नहीं किया है, इसलिए मैं इसे जांचने के लिए कभी नहीं मिला (कुछ लोग आलसी कहेंगे)।सी ++ कोशिश/फेंक/पकड़ => मशीन कोड

क्या सामान्य स्टैक try एस का ट्रैक रखने के लिए उपयोग किया जाता है, या अकेले इस उद्देश्य के लिए एक अलग प्रति थ्रेड स्टैक रखा गया है? क्या एमएसवीसी और जी ++ के बीच कार्यान्वयन बड़ा या छोटा है? कृपया मुझे कुछ छद्म एएसएम दिखाएं (आईए -32 भी ठीक है) इसलिए मुझे इसे खुद से जांचना नहीं है! :)

संपादित करें: अब मुझे आईए -32 हैंडलिंग पर एमएसवीसी के कार्यान्वयन की मूल बातें मिलती हैं। किसी को भी आईए -32, या उस मामले के लिए कोई अन्य सीपीयू पर g ++ के लिए पता है? How a C++ compiler implements exception handling

उत्तर

7

है कि बहुत विषय पर एक गहन नज़र 1997 में वापस माइक्रोसॉफ्ट जर्नल की श्रृंखला "उन्नत" था:

A Crash Course on the Depths of Win32™ Structured Exception Handling

+0

इसमें विंडोज संरचित अपवाद हैंडलिंग शामिल है, जो कि संबंधित है, लेकिन सी ++ अपवाद हैंडलिंग के समान नहीं है।पिट्रेक ने परिचय में उल्लेख किया है कि सी ++ अपवाद, जैसा कि माइक्रोसॉफ्ट और बोर्लैंड द्वारा कार्यान्वित किया गया है, एसईएच का उपयोग करते हैं, लेकिन उनके लेख में यह शामिल नहीं है कि वे इसे कैसे कार्यान्वित करते हैं। –

+0

ग्रेट एमएसवीसी/आईए -32 लेख, हालांकि लंबा। –

+1

सी ++ अपवाद केवल सीईएच अपवादों का एक वर्ग है, जिसमें एक रैपर के साथ सी ++ जानकारी (अपवाद वर्ग उदाहरण) शामिल है। सी ++ अपवादों को एसईएच का उपयोग करना है ताकि वे कर्नेल सीमाएं इत्यादि का प्रचार कर सकें। –

15

इस विषय के बारे में एक बहुत ही मूल्यवान लेख है।

+1

यह आलेख 2002 में प्रकाशित हुआ है ... क्या यह वास्तव में अद्यतित है? – Klaim

+0

मैंने बहुत पहले एक सिंहावलोकन लिया था। मुझे यकीन नहीं है कि यह अद्यतित है या नहीं। – AraK

+13

2002 सी ++ मानकों – Javier

0

जो अपवाद बहुत अच्छी तरह से निपटने के आंतरिक भागों का वर्णन करता है this document पर एक नज़र डालें:

18

अपवाद संचालकों के गरीब कार्यान्वयन प्रत्येक के लिए अपवाद संचालक ब्लॉक किसी तरह का धक्का कोशिश रनटाइम स्टैक पर क्लॉज को क्लॉज क्लॉज के रूप में दर्ज किया गया है, और इसे बंद करें क्योंकि क्लॉज क्लॉज बाहर निकला है। सबसे हाल ही में धक्का अपवाद हैंडलर ब्लॉक का पता रखने वाला स्थान भी बनाए रखा जाता है। आम तौर पर इन अपवाद हैंडलरों को एक साथ बंधे होते हैं ताकि वे सबसे हाल के पुराने संस्करणों से लिंक का पालन करके पाए जा सकें। जब कोई अपवाद होता है, तो आखिरी धक्का वाले ईएच हैंडलर ब्लॉक के लिए एक पॉइंटर पाया जाता है, और उस "कोशिश" खंड की ईएच मामलों की प्रक्रिया की जांच की जाती है। एक ईएच मामले पर एक हिट धक्का क्लीनअप का कारण बनता है जो धक्का ईएच के बिंदु पर होता है, और ईएच मामले में स्थानांतरण स्थानांतरित करता है। ईएच पर कोई भी हिट अगले ईएच को नहीं ढूंढती है, और प्रक्रिया दोहराती है। विंडोज 32-बिट एसईएच योजना इसका एक संस्करण है।

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

अच्छे कार्यान्वयन केवल श्रेणियों की एक तालिका रिकॉर्ड करते हैं जहां खंड आते हैं। इसका मतलब है कि एक कोशिश खंड में प्रवेश/बाहर निकलने के लिए शून्य ओवरहेड है। (मेरा PARLANSE समांतर प्रोग्रामिंग लैंगेज इस तकनीक का उपयोग करता है)। एक अपवाद तालिका में अपवाद बिंदु के पीसी को देखता है, और तालिका द्वारा चयनित ईएच पर नियंत्रण पास करता है। ईएच कोड ढेर को उपयुक्त के रूप में रीसेट करता है। तेज़ और सुंदर मुझे लगता है कि विंडोज 64 बिट ईएच इस प्रकार का है, लेकिन मैंने सावधानी से नहीं देखा है।

3

सी ++ मानक समिति ने "सी ++ प्रदर्शन" पर एक तकनीकी रिपोर्ट प्रकाशित की, जिसमें सी ++ विशेषताएं आपको धीमा कर देती हैं, इस बारे में कई मिथकों को समाप्त करने के लिए। इसमें अपवाद हैंडलिंग को कार्यान्वित किया जा सकता है इसके बारे में विवरण भी शामिल है। इस तकनीकी रिपोर्ट के draft मुफ्त में उपलब्ध है। खंड 5.4.1 जांचें। "अपवाद हैंडलिंग कार्यान्वयन मुद्दे और तकनीकें"।

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