2011-08-09 15 views
8

मैंने सोचा कि private विधियां, जिनका उपयोग कक्षा के अंदर नहीं किया जाता है उन्हें कंपाइलर/लिंकर द्वारा हटा दिया जाता है और अंतिम बाइनरी का हिस्सा नहीं होता है।अंतिम बाइनरी से अप्रयुक्त तरीकों को कैसे बाहर निकालना है?

मैंने एक निजी विधि के साथ एक उदाहरण वर्ग बनाया है जिसे कार्यान्वित किया गया है लेकिन इसका उपयोग नहीं किया गया है।

class XXX 
{ 
    public: 
    XXX(); 

    private: 
    void MyUnusedMethod(); 
}; 

और कार्यान्वयन फ़ाइल में:

void XXX::MyUnusedMethod() 
{ 
    const char* hugo = "ABCCHARLYABC"; 
    printf(hugo); 
} 

संकलन के बाद स्ट्रिंग अभी भी अंतिम बाइनरी में मौजूद हैं। क्यूं कर? और मैं इसे कैसे रोक सकता हूं?

सादर, चार्ली

+0

आप उस विधि को '#if 0 ... # endif' ब्लॉक में क्यों नहीं डाल सकते? – iammilind

+0

क्या आपने जीसीसी के लिए अनुकूलन झंडे tweaking करने की कोशिश की है? – slaphappy

+0

यदि आपका मतलब '-O3' ध्वज है - इससे कोई फर्क नहीं पड़ता। बेशक - अगर मुझे पता है कि मैं इसका उपयोग नहीं करूँगा, तो मैं इसे हटाने के लिए बहुत आलसी नहीं हूं। लेकिन यह भी एक सामान्य सवाल है: यह संकलक/लिंकर द्वारा क्यों नहीं छोड़ा जाता है? – Charly

उत्तर

7

एक पोर्टेबल तरीका प्रत्येक फ़ंक्शन के लिए .o फ़ाइल होना है। फिर उन .o फ़ाइलों से एक संग्रह .a बनाएँ। उस संग्रह के साथ लिंक करते समय लिंकर लिंक केवल उन .o फाइलों में लिंक करते हैं जो प्रतीकों को हल करते हैं, यानी .o फाइलें जो किसी भी कॉल को लिंक नहीं करती हैं।

link-time code generation के साथ जीसीसी के नवीनतम संस्करणों का उपयोग करने का एक और तरीका है।

+1

+1, जो मेरे लिए आदर्श समाधान प्रतीत होता है! – Veger

1

यह शायद एक बहुत बुरा विचार है, लेकिन मैं वैसे भी यह लिखने के लिए है :) आप एक टेम्प्लेटेड वर्ग बना सकते हैं, afair अप्रयुक्त तरीकों भी निकल जाते हैं।

+0

एह? वास्तव में? afaik, किसी भी तत्काल में सभी कोड होंगे .. – Nim

+0

मुझे यह सचमुच सुनिश्चित करने के लिए जांचना है, मैंने सोचा कि मैंने कहीं कहीं पढ़ा है। मेरे पास अभी टेम्पलेट बुक नहीं है:/ – duedl0r

+0

उत्तर सही है।तर्क यह है कि 'वर्ग Foo ' उपयोगी हो सकता है भले ही सभी विधियां 'टी' के सभी मानों के लिए संकलित न हों। जैसे 'टी == const int '' Foo 'के सभी गैर-कॉन्स्ट विधियों को तोड़ सकता है। – MSalters

3

संकलन के बाद अंतिम बाइनरी में स्ट्रिंग अभी भी मौजूद है। क्यों

दूसरों ने सुझाव दिया है कि आपके अंतिम बाइनरी में उस अप्रयुक्त कोड से कैसे छुटकारा पाएं। मैं Why पर थोड़ा सा जवाब देना चाहता हूं - यहां दो बिंदु हैं कि फ़ंक्शन को निकालने के लिए असंभव क्यों हो सकता है।

क्योंकि किसी अन्य वस्तु फ़ाइल extern का उपयोग कर मूल्य का उपयोग कर सकते हैं जब तक आप static linkage साथ कि XXX प्रकार के सभी वस्तुओं की घोषणा की, संकलक उत्पन्न वस्तु फ़ाइल से प्रकार (और इसलिए विधि) पट्टी नहीं कर सकते। लिंकर, जो एक ही समय में सभी ऑब्जेक्ट फ़ाइलों को देख सकता है, इसे हल करने में सक्षम हो सकता है।

हालांकि, चूंकि आपने अपना प्रश्न gcc के रूप में टैग किया है, इसलिए हो सकता है कि आप -fvisibility=hidden के साथ संकलित और/या लिंक नहीं कर रहे हैं। उस स्थिति में, यहां तक ​​कि लिंकर प्रतीक (और इसलिए कोड) को पट्टी नहीं कर सकता है क्योंकि अन्य मॉड्यूल रनटाइम पर प्रतीक को हल कर सकते हैं।

+0

"(और इसलिए विधि)" आधार से पालन नहीं करता है। ऑब्जेक्ट्स की संख्या के बावजूद, यदि 'MyUnusedMethod' के लिए कोई भी कॉल नहीं है तो उसे बाइनरी में नहीं होना चाहिए। – MSalters

+0

@MSalters: यदि 'MyUnusedMethod' का प्रतीक अंतिम मॉड्यूल (जैसे साझा लाइब्रेरी के निष्पादन योग्य) में नहीं है, तो हो सकता है कि कुछ अन्य मॉड्यूल रनटाइम पर प्रतीक को हल और एक्सेस कर सकें। कोड के लिए यह बहुत आम है जिसका उपयोग मॉड्यूल में रहने के लिए मॉड्यूल में नहीं किया जाता है - साझा लाइब्रेरी द्वारा सामने किए गए कार्यों के बारे में सोचें। –

7

यह आमतौर पर -फंक्शन-सेक्शन -फडाटा-सेक्शन जीसीसी के विकल्प पास करके किया जाता है। अधिक जानकारी के लिए यह link देखें।

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

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