सी/सी ++ कंपाइलर्स केवल ओएस, -ओ 1 और -ओ 2 का उपयोग करते समय स्थिर पैरामीटर (संकलित समय पर ज्ञात) के साथ एकल परत फ़ंक्शंस को अनुकूलित करते हैं। वे सभी परतों को अनुकूलित नहीं करते हैं। केवल -O3 ऐसा कर सकता है। जीसीसी WinAVR 4.3.3 है जो विशेषता "अनुकूलन" का समर्थन नहीं करता है।सी/सी ++ कॉलिंग फ़ंक्शंस में निरंतर चर के लिए अनुकूलित करें
void inner(double value)
{
//operations using value
//...
}
void outer(double value)
{
//few operations using value
//...
inner(value);
}
int main()
{
inner(1); //optimize
outer(1); //only optimize by using -O3
}
अनुवर्ती के अलावा अन्य संभावित समाधान क्या हैं?
- -O3 पकड़ प्रोग्राम या फ़ाइल (दुरुपयोग आकार को उड़ाने जाएगा)
- विशेषता कार्यों के लिए -O3 अनुकूलन (4.3.3 का समर्थन नहीं करता)
- मैक्रो (त्रुटि प्रवण)
अद्यतन:
//inner function
static inline void _delay_us(double __us) __attribute__((always_inline));
//outer function
void f(double);
inline f1(double);
static inline f2(double);
static f3(double);
f1 अनुकूलित है ख चेतावनी देने के लिए '_delay_us' स्थिर है लेकिन इनलाइन फ़ंक्शन 'f1' में उपयोग किया जाता है जो स्थैतिक फ़ंक्शन समस्या के कारण स्थिर नहीं है। दूसरों को अनुकूलित नहीं किया गया है।
समाधान:
static inline void outer(double) __attribute__((always_inline));
इनलाइन कुंजी है। मेरा बाहरी कार्य इनलाइन के लिए बहुत बड़ा है। विशेषता हमेशा_इनलाइन फ़ंक्शन को इनलाइन होने के लिए मजबूर करती है। यह संकलक को अनुकूलन को समझने की कोशिश करने से कम संकलन लागत के साथ फ़ंक्शन को अनुकूलित करने की अनुमति देता है। -ओ 3 ऑप्टिमाइज़ेशन करने के लिए पर्याप्त स्मार्ट है लेकिन नहीं। - कुछ संकलक विकल्पों की आवश्यकता हो सकती है। (कीवर्ड स्थिर आवश्यक है क्योंकि आंतरिक फ़ंक्शन भी स्थिर इनलाइन है।)
एचएम, मुझे समझ में नहीं आ रहा है कि यह चिंता क्यों है। यदि आप संकलक को अनुकूलित करना चाहते हैं, तो उसे बताएं। यदि आपको डर है कि '-O3' (या जो भी स्तर) आपके कोड आकार को उड़ाता है, तो' ओएस 'जाने का रास्ता है। –
कोड 8-बिट माइक्रोकंट्रोलर में उपयोग किया जाता है जिसमें हार्डवेयर फ़्लोटिंग पॉइंट एएलयू नहीं होता है। -ओ 3 वास्तव में इस समारोह में -ओएस से छोटे कोड आकार देते हैं, 4k बनाम 400 – keithyip