जीसीसी जीसीसी को रोकने के लिए एक बयान 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 ए ' क्योंकि व्यावहारिक रूप से नीड इस बयान से अधिक नियंत्रण गतिशील रूप से डेटा का ध्यान रखा जाना चाहिए आवंटित होता है।
मैं यहाँ कुछ स्पष्ट याद आ रही है?!
'-फनो-एलिइड-कन्स्ट्रक्टर' का प्रयास करें। (और ध्यान दें कि आपने क्लास परिभाषा के अंदर उन्हें परिभाषित करने के आधार पर अपने रचनाकारों को इनलाइन घोषित किया है।) –
क्या वाकई इनलाइनिंग है? यह मेरे लिए आरवीओ की तरह दिखता है। –
उत्तर के लिए धन्यवाद! दरअसल, यह रेखांकित नहीं है। यह अनुकूलन है। इसके साथ मैं देखूंगा कि काम करने के लिए मेरी असली जिंदगी संरचना है या नहीं। (फिलहाल यह नहीं करता है)। एक प्रश्न: इस ऑप्टिमाइज़ेशन संभावना को बंद कर सकते हैं (-फनो-एलिइड-कन्स्ट्रक्टर) प्रोग्राम व्यवहार को बदल सकते हैं (कहें कि कॉपी कन्स्ट्रक्टर में महत्वपूर्ण कोड है) गति को छोड़कर? – ritter