2010-03-16 11 views
6

मैं रिलीज बिल्ड के लिए -फिनलाइन-फ़ंक्शंस ऑप्टिमाइज़ेशन के साथ जीसीसी का उपयोग कर रहा हूं। कोड ब्लोट का मुकाबला करने के लिए क्योंकि मैं एक एम्बेडेड सिस्टम पर काम करता हूं, मैं कहना चाहता हूं कि विशेष कार्यों को रेखांकित न करें। ऐसा करने का स्पष्ट तरीका फ़ंक्शन विशेषताओं यानी विशेषता (नोलाइन) के माध्यम से होगा। समस्या यह है कि जब मैं ग्लोबल-फ़िनलाइन-फ़ंक्शंस ऑप्टिमाइज़ेशन पर स्विच करता हूं जो -O3 स्विच का हिस्सा होता है तो यह काम नहीं करता है।gcc -finline-functions व्यवहार?

यह भी एक ही कार्य के एक गैर-टेम्पलेट संस्करण के रूप में टेम्पलेट होने के साथ कुछ करने के लिए कुछ भी नहीं है जो अपेक्षित है।

क्या कोई वैश्विक विचार चालू होने पर इनलाइनिंग को नियंत्रित करने का कोई विचार है?

#include <cstdlib> 
#include <iostream> 

using namespace std; 

class Base 
{ 
public: 

    template<typename _Type_> 
    static _Type_ fooT(_Type_ x, _Type_ y) __attribute__ ((noinline)); 
}; 

template<typename _Type_> 
_Type_ Base::fooT(_Type_ x, _Type_ y) 
{ 
    asm(""); 
    return x + y; 
} 


int main(int argc, char *argv[]) 
{ 
    int test = Base::fooT(1, 2); 
    printf("test = %d\n", test); 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
+1

संबंधित नहीं है, लेकिन अंडरस्कोर से शुरू होने वाले पहचानकर्ता एक कैपिटल के लिए आरक्षित हैं। – GManNickG

+0

परिभाषा से __attribute __ ((noinline)) संलग्न नहीं होना चाहिए? – jpalecek

+0

@jpalecek: कोई संकलन त्रुटि नहीं है – user176168

उत्तर

4

docs for GCC's noinline कहते हैं::

इस समारोह विशेषता इनलाइन किए जाने वाले नहीं माने जाने से एक समारोह से बचाता है

कोड यह रहा। यदि फ़ंक्शन के साइड इफेक्ट्स नहीं हैं, तो इनलाइनिंग के अलावा ऑप्टिमाइज़ेशन हैं जो फ़ंक्शन कॉल को अनुकूलित करने का कारण बनता है, हालांकि फ़ंक्शन कॉल लाइव है। दूर अनुकूलित किया जा रहा से इस तरह के कॉल रखने के लिए, कहा जाता समारोह में

 asm (""); 

(देखना विस्तारित ASM) शब्दों में कहें, एक विशेष पक्ष प्रभाव

मुझे लगता है कि क्या आप के लिए हो रहा हो सकता है के रूप में काम करने के लिए यह है कि Base::fooT<> फ़ंक्शन का कोई दुष्प्रभाव नहीं है, इसलिए जीसीसी उपरोक्त वर्णित अनिर्दिष्ट अन्य अनुकूलन का आह्वान कर रहा है।

+0

उत्तर देने में देरी के लिए खेद है! नहीं, दुख की बात है कि जीसीसी अभी भी इसे रेखांकित करता है, मैंने पहले यह कोशिश की थी। मैं 4.1.1 का उपयोग कर रहा हूं क्या कोई इस से संबंधित बग के बारे में जानता है? उत्तर के लिए धन्यवाद हालांकि ऐसा लगता है कि इस विषय के बारे में बहुत जानकारी नहीं है ... – user176168

1

static के बाद और इतने तरह परिभाषा से पहले noinline विशेषता डालने का प्रयास करें:

template<typename _Type_> 
    static __attribute__ ((noinline)) _Type_ fooT(_Type_ x, _Type_ y); 

यह मेरे लिए काम किया है और दूसरों के लिए भी काम करने लगता है, देखें: How can I tell gcc not to inline a function?

किसी कारण ऐसा नहीं के लिए gcc दस्तावेज के बावजूद फ़ंक्शन बॉडी में noinline विशेषता को फ़ंक्शन बॉडी में asm("") डालकर काम नहीं कर रहा है।

1

छोटे पुराने धागे लेकिन उत्तर देने योग्य। यदि आपके ऊपर काम करने के अलावा कुछ भी सरल कामकाज नहीं है। आपको अनुवाद इकाई से कार्यान्वयन छिपाना होगा जहां आप इसे किसी अन्य विधि को किसी अन्य सीपीपी फ़ाइल में डालकर उपयोग करना चाहते हैं।

संपादित

जीसीसी> = 4.5 में एक विशेषता noclone जो समारोह विशेषज्ञता के रास्ते में noinline को अधिक्रमित है।