2011-08-30 18 views
6

जीसीसी जीसीसी को रोकने के लिए एक बयान inlines - कोई बात नहीं कितना मुश्किल मैं इसे रोकने के लिए प्रयास करें। मैंइनलाइन को

  • -fno-inline
  • -O0
  • __attribute__ ((noinline))
  • dummy asm("")

कोई सफलता की कोशिश की! यहाँ कोड:

#include<iostream> 

using namespace std; 

struct A { 
    A() {cout << "A::A()" <<endl; } 
    A(const A& a) {cout << "A::A(copy)" <<endl; } 
    A& operator=(const A& a) {cout << "A::=()" <<endl; return *this;} 
}; 

A __attribute__ ((noinline)) func() 
{ 
    cout << "func()" << endl; 
    A loc; 
    asm(""); 
    return loc; 
} 

int main() { 
    A a = func(); 
} 

इस की दुर्भाग्यपूर्ण उत्पादन (छ ++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2)

func() 
A::A() 

बयान एक एक = समारोह का क्या हुआ है(); ??

इस प्रयोग के लिए कारण यह है कि मुझे पता है कि क्या होता है जब निष्पादन इस बयान के लिए आता है (क्योंकि मैं यह कैसे किया जाता नियंत्रित करने की जरूरत है) चाहते हैं:

A a = func(); 

मैंने पढ़ा है कि प्रति निर्माता कहा जाता है जब एक

A a = b; 

करता है (इस मामले में कॉपी-निर्माता कहा जाता है लेकिन नहीं मामले में एक एक = समारोह();।) समारोह बजाय inlined है। मैं मेरी "struct ए ' क्योंकि व्यावहारिक रूप से नीड इस बयान से अधिक नियंत्रण गतिशील रूप से डेटा का ध्यान रखा जाना चाहिए आवंटित होता है।

मैं यहाँ कुछ स्पष्ट याद आ रही है?!

+2

'-फनो-एलिइड-कन्स्ट्रक्टर' का प्रयास करें। (और ध्यान दें कि आपने क्लास परिभाषा के अंदर उन्हें परिभाषित करने के आधार पर अपने रचनाकारों को इनलाइन घोषित किया है।) –

+1

क्या वाकई इनलाइनिंग है? यह मेरे लिए आरवीओ की तरह दिखता है। –

+0

उत्तर के लिए धन्यवाद! दरअसल, यह रेखांकित नहीं है। यह अनुकूलन है। इसके साथ मैं देखूंगा कि काम करने के लिए मेरी असली जिंदगी संरचना है या नहीं। (फिलहाल यह नहीं करता है)। एक प्रश्न: इस ऑप्टिमाइज़ेशन संभावना को बंद कर सकते हैं (-फनो-एलिइड-कन्स्ट्रक्टर) प्रोग्राम व्यवहार को बदल सकते हैं (कहें कि कॉपी कन्स्ट्रक्टर में महत्वपूर्ण कोड है) गति को छोड़कर? – ritter

उत्तर

15

नहीं, इस समारोह inlined जा रहा है के साथ कोई संबंध नहीं है। समारोह को रेखांकित करने से वेनीय व्यवहार नहीं बदलेगा।

यह एक अनुकूलन कहा प्रतिलिपि इलिजन कि संकलक गंतव्य पर सीधे वापसी मान का निर्माण करके एक प्रति से बचने के लिए अनुमति देता है। आप इसे g ++ ध्वज -fno-elide-constructors से अक्षम कर सकते हैं।

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

5

यदि struct A में गतिशील रूप से आवंटित डेटा शामिल है, तो उपयुक्त स्मृति निर्माता/कन्स्ट्रक्टर में उस स्मृति को प्रबंधित करना आपकी ज़िम्मेदारी है। कई वर्ग गतिशील रूप से आवंटित डेटा प्रबंधित करते हैं और एलेड प्रतियों के साथ ठीक काम करते हैं। आरवीओ और एनआरवीओ महत्वपूर्ण अनुकूलन हैं।

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