2012-08-13 18 views
7

सी (++) (एवीआर-जीसीसी) में एक एम्बेडेड सिस्टम पर मेनू को लागू करने में, मैं शून्य फ़ंक्शन पॉइंटर के साथ समाप्त हुआ जो तर्क लेता है, और आमतौर पर उनका उपयोग करता है।नल पॉइंटर तर्क कितने महंगा हैं?

// void function prototype 
void (*auxFunc)(char *); 

कुछ मामलों में (वास्तव में काफी कुछ), समारोह वास्तव में तर्क की जरूरत नहीं है, इसलिए मैं कुछ ऐसा करना होगा:

if (something) doAuxFunc(NULL); 

मैं जानता हूँ कि मैं सिर्फ एक को ओवरलोड सकता है अलग-अलग फ़ंक्शन प्रकार, लेकिन मैं वास्तव में ऐसा करने की कोशिश नहीं कर रहा हूं क्योंकि मैं कई ऑब्जेक्ट्स को तुरंत चालू कर रहा हूं और उन्हें हल्का रखना चाहता हूं।

कई फ़ंक्शन प्रोटोटाइप को लागू करने से भी बदतर पॉइंटर्स (जब वे वास्तविक सूचक के लिए हैं) के साथ कई फ़ंक्शन कॉल कर रहे हैं?

+6

प्रोफाइलर क्या कहता है? – zoul

+2

आपको लगता है कि अधिभार "भारी" क्यों हैं? –

+0

@KerrekSB अधिकतर क्योंकि (अपेक्षाकृत) इन वस्तुओं को रखने वाले कई वस्तुएं होंगी, और एम्बेडेड सिस्टम पर स्थान मूल्यवान होगा। इस मामले में एक मेनू परियोजना की मुख्य कार्यक्षमता का एक सहायक हिस्सा है। – falro

उत्तर

9

एनयूएलएल के लिए जांच एक माइक्रोक्रोनरोलर पर भी एक बहुत छोटा ओवरहेड है - 0 के मुकाबले तुलना बिजली तेज होनी चाहिए। यदि आप कई कार्यों को अधिभारित करते हैं, तो आप प्रदर्शन में (बहुत मामूली) सुधार के लिए पठनीयता को क्रूस पर चढ़ाएंगे। बस जीसीसी के ऑप्टिमाइज़र को इसकी सामग्री दें, यह बहुत अच्छा है :)

1

मुझे लगता है कि "ट्रेडऑफ" प्रत्येक दृष्टिकोण के लिए हास्यास्पद रूप से कम है, लेकिन यह समय आपके लिए बेंचमार्क करने का समय है। यदि आप ऐसा करते हैं, तो कृपया कुछ परिणाम पोस्ट करें :)

2

0 की जांच करना वास्तव में सस्ता है, ओवरलोडिंग भी सस्ता है, क्योंकि यह तय करने के लिए काम करने वाले संकलन समय पर निर्णय लिया जाता है।

लेकिन अगर आपको लगता है कि आपके इंटरफेस ओवरलोडिंग के साथ बहुत जटिल हो जाते हैं और आपका फ़ंक्शन छोटा है तो आपको इसे inline घोषित करना चाहिए और इसे हेडर में रखना चाहिए। 0 के लिए चेकग को किसी भी सभ्य आधुनिक कंपाइलर द्वारा आसानी से अनुकूलित किया जा सकता है।

+0

चूंकि यह एक एम्बेडेड सिस्टम के लिए एक समाधान है, इसलिए इनलाइनिंग के परिणामस्वरूप अधिक कोड मेमोरी का उपयोग किया जा रहा है जो इस मामले में भी महंगा है। – syplex

+0

@syplex: यह फ़ंक्शन कॉल और क्लीनअप के आकार पर निर्भर करता है। इनलाइनिंग _save_ स्थान कर सकते हैं।यह विशेष रूप से ऐसा मामला है जब उचित अनुकूलक अनियंत्रित निर्देशों को समाप्त कर सकता है। एक सामान्य सरल उदाहरण 'फू :: गेटबार' विधि है जो फू में बार सदस्य को केवल पढ़ने के लिए पहुंच प्रदान करता है। यह एक साधारण सूचक ऑफ़सेट गणना के रूप में समाप्त हो सकता है, और इसे अन्य ऑफ़सेट गणनाओं के साथ भी जोड़ा जा सकता है। – MSalters

+0

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

3

डिस्सेप्लिब्स को देखें, इसे पहले तर्क के रूप में पास करने के लिए एक शून्य (शून्य) उत्पन्न करना चाहिए, जो या तो एक रजिस्टर या स्टैक स्थान जलाता है, अगर यह एक रजिस्टर जलाता है तो यह आपको धक्का और पॉप खर्च कर सकता है कॉलिंग फ़ंक्शन रजिस्टरों के लिए भूख लगी है। (कॉलिंग कन्वेंशन को कार्यान्वित करने के लिए फ़ंक्शन को रजिस्टरों के लिए भूखा होने पर फ़ंक्शन कॉल का उपयोग करके आप धक्का दे सकते हैं और पॉप कर सकते हैं)।

तो लागत की संभावना है, लेकिन हो सकता है कि आप चीजों को बदलने के तरीके को बदलने के लिए पर्याप्त लागत न हो।

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