2011-02-09 18 views
11

मैंने देखा है कि अगर मैं अपने प्रोग्राम है जो g++ द्वारा संकलित किया गया पर strings चलाने उत्पादन इसे इस्तेमाल करता है कि विभिन्न वर्गों के नाम शामिल हैं।संकलित बाइनरी में जी ++ स्टोर क्लास का नाम क्यों है?

कार्यक्रम -O3 और बिना -g या -p के साथ संकलित किया गया था, और बाइनरी को पट्टी करते समय कक्षा के नाम अभी भी मौजूद हैं।

मैं सोच रहा था कि क्यों यह आवश्यक है g++ बाइनरी इस जानकारी को संग्रहीत करने के लिए? क्लास नाम जो मौजूद हैं वे सभी कक्षाएं प्रतीत होते हैं जो वर्चुअल फ़ंक्शंस का उपयोग करते हैं, इसलिए मुझे संदेह है कि यह इसके साथ कुछ करने के लिए है।

+0

संदर्भ का बिंदु: 'g ++ -c blah.o blah.cpp' का उपयोग करने से इसे निष्पादन योग्य के रूप में जोड़ने के बाद कक्षा के नाम शामिल नहीं होते हैं। – mkb

उत्तर

12

यह RTTI के साथ कुछ करने के लिए हो सकता है, विशेष रूप से, आरटीटीआई आपको किसी दिए गए चर के वर्ग के नाम से पूछने की अनुमति देता है। typeid कीवर्ड देखें। यदि यह मामला है तो यह समझाएगा कि यह केवल उन कक्षाओं के साथ क्यों होता है जिनमें वर्चुअल फ़ंक्शंस हैं - आरटीटीआई केवल वर्चुअल फ़ंक्शंस वाले वर्गों के लिए काम करता है।

+0

हाँ, यह RTTI होने के लिए लग रहा है, मैं -fno-RTTI के साथ फिर से संकलित और वर्ग के नाम तार उत्पादन में दिखाई नहीं देते। – Xeno

+0

@Xeno: जब आप 'टाइपिड (x) .name() 'का उपयोग करते हैं तो gcc कक्षा के उलझन वाले नाम को वापस देता है। –

3

हाँ, यह शायद कैसे जी ++ लागू करता RTTI से कोई लेना देना नहीं है। इसे रनटाइम के दौरान सही प्रकार के लिए क्लास पेड़ के माध्यम से खोजने में सक्षम होना चाहिए, इसलिए इसे किसी पेड़ को किसी भी तरह से स्टोर करना होगा। वर्चुअल फ़ंक्शन वाले किसी भी वर्ग को "पॉलिमॉर्फिक" माना जाता है और निष्पादन योग्य में विशेष आरटीटीआई जानकारी शामिल की आवश्यकता होती है। मानक यह नहीं कहता कि यह कैसे किया जाता है, लेकिन कक्षा के नाम कुछ भी के रूप में ज्यादा समझ में आता है।

+0

यह वास्तव में नाम संग्रह करने की आवश्यकता नहीं है, केवल एक आईडी। एक हैश, उदाहरण के लिए, भी काम करेगा। –

+0

अच्छी बात मैंने कभी दावा नहीं किया कि उसने किया था। –

4

जी ++ RTTI डिफ़ॉल्ट रूप से सक्षम किया गया है। -fno-rtti स्विच करें यदि आपको आरटीटीआई की आवश्यकता नहीं है और आप पाएंगे कि स्ट्रिंग मौजूद नहीं हैं।

+0

ध्यान दें कि आरटीटीआई को अक्षम करने से आम तौर पर अपवाद भी अक्षम होते हैं, क्योंकि आरटीटीआई और अपवाद हैंडलिंग आमतौर पर कई मैकेनिक्स साझा करते हैं। –

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