c++ - How to prevent a virtual method from always being compiled? -
एक Arduino पुस्तकालय पर काम करते समय मैंने एक दिलचस्प संकलन समस्या में भाग लिया है। सभी कक्षाओं में सभी आभासी विधियां एकत्रित हो जाती हैं ... हमेशा यहां तक कि जब वर्ग कभी भी निर्माण या भी उल्लेख नहीं किया जाता है।
उदाहरण Arduino कोड जो इस समस्या को पुन: उत्पन्न करता है:
वर्ग BaseClass {आभासी शून्य विधि (); }; शून्य BaseClass :: method () {Serial.println ("यह बिल्कुल संकलित नहीं किया जाना चाहिए ..."); } शून्य सेटअप () {} void loop () {}
बेसक्लास परिणाम 670 बाइट्स के अंतिम बाइनरी में छोड़कर। यह भी शामिल है, जबकि कभी नहीं वर्ग का उपयोग कर, 3.354 बाइट्स का एक कोड आकार में परिणाम है।
कि अक्सर कभी नहीं सब पर इस्तेमाल किया जाएगा एक पुस्तकालय वर्गों का एक बहुत युक्त, सभी एक आभासी अद्यतन युक्त के लिए ()
रुटीन, इस तरह का व्यवहार अस्वीकार्य है मैंने अभी तक जो एकमात्र उपाय पाया है, वह उपयोगकर्ता को उन घटकों के लिए हेडर फाइलों को शामिल करने के लिए मजबूर करना है जो वे उपयोग करना चाहते हैं। अधिमानतः, हालांकि, मैं पुस्तकालय सरल रखने होगा और न ऐसा करने के लिए उपयोगकर्ता की आवश्यकता है।
वहाँ एक AVR विधि विशेषता है कि संकलक बता सकते हैं केवल एक आभासी विधि संकलित करने के लिए करता है, तो वर्ग कहीं निर्माण किया जा रहा है है ? वैकल्पिक रूप से, क्या वहाँ कंपाइलर विकल्प हैं जो मुझे इन अप्रयुक्त वर्चुअल विधियों को ऑप्टिमाइज़ करने में सक्षम बना सकते हैं?
एटीएमएजी 2560 एवीआर का उपयोग, जी + + कंपाइलर के साथ वर्तमान संकलक विकल्प Arduino द्वारा पारित:
C: \ Program Files (x86) \ Arduino \ हार्डवेयर \ उपकरण \ AVR \ बिन \ AVR-जी ++ -c जी -Os -Wall -fno- अपवाद -ffunction वर्गों -fdata वर्गों -mmcu = atmega2560 -DF_CPU = 16000000L -MMD -DUSB_VID = अशक्त -DUSB_PID = अशक्त -DARDUINO = 106 आईसी: \ Program Files (x86) \ Arduino \ हार्डवेयर \ arduino \ कोर \ arduino आईसी: \ Program Files (x86) \ Arduino \ हार्डवेयर \ arduino \ \ मेगा
आपके उन सभी कोई-instantiated टेम्प्लेट के पूरे कार्यान्वयन के साथ एक हैडर सही झंडे / उन वे उपयोग के लिए स्पष्ट इन्स्तांत शामिल हैं और उपयोग करना होगा।
Comments
Post a Comment