2013-04-27 11 views
5
string str="fujian"; 

कुछ किताबें कहती हैं कि कोड कॉपी कन्स्ट्रक्टर को ट्रिगर करेगा, लेकिन जी ++ इसे अनुकूलित करेगा ताकि कॉपी कन्स्ट्रक्टर को कॉल नहीं किया जाएगा।-O0 जीसीसी संकलन अनुकूलन को अक्षम क्यों नहीं कर सकता?

हालांकि, मैंने ऑप्टिमाइज़ेशन को अक्षम करने के लिए g ++ कमांड -ऑ 0 का उपयोग किया, लेकिन यह अभी भी कॉपी कन्स्ट्रक्टर को ट्रिगर नहीं कर सकता है।

इसे कैसे समझें?

+0

आप कैसे निर्धारित कर रहे हैं कि प्रतिलिपि बनाने वाले को बुलाया गया था या नहीं? –

+0

मैं कॉपी कन्स्ट्रक्टर को फिर से लिखता हूं और – jiafu

+0

नामक लॉग इन करता हूं मेरा अनुमान यह है कि कुछ जगह पर g ++ लगातार-फोल्डिंग/प्रचार कर रहा है - फ्रंटेंड में हो सकता है। और मुझे लगता है कि आप इसे अक्षम नहीं कर सकते हैं। – JohnTortugo

उत्तर

9

जीसीसी और क्लैंग के साथ आप कॉपी/चाल elision अनुकूलन को बंद करने के लिए -fno-elide-constructors संकलन ध्वज का उपयोग कर सकते हैं।

+0

क्यों o0 काम नहीं कर सकता? – jiafu

+0

मैं सभी को टिगर प्रतिलिपि बनाना नहीं चाहता हूं, लेकिन – jiafu

+0

@jiafu का अध्ययन करने के लिए मूल प्रिंसिपल को समझने के लिए: मुझे यकीन नहीं है कि क्यों '-o0' प्रतिलिपि प्रतिलिपि/चाल elision में मदद नहीं करेगा। यदि आप उस व्यवहार को दबाना चाहते हैं, तो आपको उस ध्वज का उपयोग करने की आवश्यकता है। –

1

कॉपी एलिजन नियम आईएसओ सी ++ 12.8 पर आधारित है। हालांकि आमतौर पर ऑप्टिमाइज़ेशन के लिए उपयोग किए जाने वाले अन्य नियम सामूहिक रूप से खंड 1 में "as-if" नियम के रूप में बुलाए जाते हैं (जो कार्यान्वयन प्रोग्राम को अमूर्त मशीन मॉडल के आधार पर "गैर-अनुकूलित" प्रोग्राम सेमेन्टिक्स के साथ कुछ अलग तरीके से व्यवहार करने की अनुमति देता है), यह नियम इतना है विशेष है कि आप "अनुकूलित" कोड का इलाज कर सकते हैं, मूल अर्थ के रूप में सटीक व्यवहार करता है। दूसरे शब्दों में, समेकित कन्स्ट्रक्टर कॉल अमूर्त मशीन के व्यवहार में बिल्कुल मौजूद नहीं हो सकते हैं।

अगर कोई अपरिभाषित व्यवहार है, के साथ या अनुकूलन के बिना के रूप में अगर एक ही नियम, अनुकूलित कार्यक्रम और गैर अनुकूलित कार्यक्रम का नमूदार व्यवहार होना चाहिए के अनुसार (हालांकि वे, आदि के प्रदर्शन पर भिन्न हो सकती है) । हालांकि, प्रतिलिपि प्रतिलिपि अधिक आक्रामक है, अर्थात्, यह देखने योग्य व्यवहार को बदल सकता है।

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

WG21/N4296

1,9 कार्यक्रम निष्पादन

5 एक अनुरूप कार्यान्वयन एक अच्छी तरह से गठित कार्यक्रम के लिए इसी उदाहरण के संभावित फांसी से एक के रूप में एक ही नमूदार व्यवहार प्रस्तुत करेगा क्रियान्वित उसी प्रोग्राम के साथ सार मशीन और एक ही इनपुट। हालांकि, अगर इस तरह के किसी निष्पादन में एक अनिर्धारित ऑपरेशन होता है, तो यह अंतर्राष्ट्रीय उस स्थान के साथ उस प्रोग्राम को कार्यान्वित करने के कार्यान्वयन पर मानक स्थानों की आवश्यकता नहीं होती है (पहले अपरिभाषित ऑपरेशन से पहले के संचालन के संबंध में भी नहीं)।

8 एक अनुरूप क्रियान्वयन पर कम से कम आवश्यकताएँ हैं:

(8,1) - अस्थिर वस्तुओं तक पहुंच सख्ती से सार मशीन के नियमों के अनुसार मूल्यांकन किया जाता है।

(8.2) - प्रोग्राम समाप्ति पर, फाइलों में लिखे गए सभी डेटा संभावित परिणामों में से एक के समान होंगे जो अमूर्त अर्थशास्त्र के अनुसार कार्यक्रम के निष्पादन का उत्पादन होता।

(8.3) - इंटरैक्टिव उपकरणों की इनपुट और आउटपुट गतिशीलता ऐसी फैशन में होगी जो को आउटपुट वास्तव में इनपुट के लिए इंतजार करने से पहले आउटपुट वितरित की जाती है। एक इंटरैक्टिव डिवाइस का गठन कार्यान्वयन-परिभाषित है।

इन सामूहिक रूप से कार्यक्रम के देखने योग्य व्यवहार के रूप में जाना जाता है। [नोट: अमूर्त और वास्तविक अर्थशास्त्र के बीच अधिक कठोर पत्राचार प्रत्येक कार्यान्वयन द्वारा परिभाषित किया जा सकता है। अंत टिप्पणी]

12.8 कॉपी करने और आगे बढ़ वर्ग वस्तुओं

31 जब कुछ मानदंडों को पूरा किया जाता है, एक कार्यान्वयन एक वर्ग वस्तु की कॉपी/कदम निर्माण छोड़ करने की अनुमति दी है, भले ही निर्माता के लिए चयनित ऑब्जेक्ट के लिए कॉपी/मूव ऑपरेशन और/या विनाशक दुष्प्रभाव हैं। ऐसे मामलों में, कार्यान्वयन, छोड़े गए प्रतिलिपि/चाल ऑपरेशन के स्रोत और लक्ष्य का व्यवहार करता है, उसी वस्तु का संदर्भ देने के केवल दो अलग-अलग तरीकों के रूप में, और उस ऑब्जेक्ट का विनाश उस समय के बाद होता है जब दोनों ऑब्जेक्ट्स optimization.122 कॉपी/कदम आपरेशन के इस इलिजन, कॉपी इलिजन कहा जाता है, निम्नलिखित परिस्थितियों (जो कई प्रतियां खत्म करने के लिए जोड़ा जा सकता है) में की अनुमति दी है के बिना नष्ट कर दिया गया है:

...

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