2012-10-18 14 views
6

जब कोड का एक ही टुकड़ा ऑप्टिमाइज़ेशन (g++ -O0) के साथ संकलित किया गया है और फिर फिर ऑप्टिमाइज़ेशन पूरी तरह से सक्षम (g++ -O3) के साथ, स्रोत कोड का तर्क कैसे बदला जा सकता है?कंपाइलर अनुकूलन कोड तर्क को कैसे प्रभावित कर सकता है?

उदाहरण के लिए, compilers

ये दो अनुकूलन मूल स्रोत कोड की अखंडता को प्रभावित किए बिना कोड को तेजी से निष्पादित करते हैं। इन अनुकूलन के बिना चलने वाला कोई भी कोड उनके साथ सक्षम होगा।

लेकिन, कंपाइलर अनुकूलन कोड तर्क को भी प्रभावित कर सकता है। यहां दो उदाहरण दिए गए हैं जिन्हें मैं जानता हूं:

  • Removing copy constructors and assignment operators अस्थायी से संभावित दुष्प्रभावों को हटा सकता है।
  • फ्लोटिंग पॉइंट मान वाले अंकगणित में घुमावदार फ्लोटिंग पॉइंट त्रुटि को प्रभावित कर सकता है (उम्मीद है कि -ffast-math तर्क की आवश्यकता है)।

मैं बहुत ही आश्चर्यचकित और भाग्यशाली था, इनके बारे में जानने के लिए क्योंकि वे गलत स्थिति में भारी संभावनाएं बन सकते थे।

तो मैं जानना चाहता हूं, क्या कोई अन्य मामला है जहां सी ++ कंपाइलर अनुकूलन कोड तर्क को प्रभावित करेगा? मैं विशेष रूप से g ++ कंपाइलर के तहत सी ++ 11 (बिना किसी अपरिभाषित व्यवहार के) के बारे में जानकारी ढूंढ रहा हूं, लेकिन अन्य कंपाइलरों के लिए सुझावों का स्वागत है।

+3

यह उल्लेख करना न भूलें कि अपरिभाषित व्यवहार का अर्थ कुछ भी होगा। – Mysticial

+0

मेरा मानना ​​है कि संकलक भी सामान की गणना नहीं कर सकता है जिसका उपयोग बाद में कभी नहीं किया जाता है। हालांकि यह आपके कोड के तर्क को नहीं बदलता है, लेकिन यदि आप प्रदर्शन को माप रहे हैं तो यह खराब हो सकता है। हालांकि मैं इसके बारे में निश्चित नहीं हूँ। – leo

+0

@leo अच्छा बिंदु! हालांकि, मैं हमेशा आशा करता हूं कि अनुकूलन के साथ संकलन तेजी से प्रदर्शन करेगा, क्योंकि यह अनुकूलक का काम है। – Ryan

उत्तर

8

"के रूप में यदि" नियम:

कार्यान्वयन रूप में लंबे समय के रूप में यदि आवश्यकता आज्ञा का पालन किया गया था परिणाम है के रूप में इस अंतर्राष्ट्रीय मानक के किसी भी आवश्यकता उपेक्षा, जहाँ तक नि: शुल्क है जैसा कि प्रोग्राम के व्यवहार व्यवहार से निर्धारित किया जा सकता है। उदाहरण के लिए, वास्तविक कार्यान्वयन की आवश्यकता अभिव्यक्ति के हिस्से का मूल्यांकन नहीं करती है, यदि यह अनुमान लगाती है कि इसका मान उपयोग नहीं किया गया है और के अवलोकन व्यवहार को प्रभावित करने वाले कोई साइड इफेक्ट्स प्रोग्राम का उत्पादन नहीं किया जाता है।

हालांकि, मानक एक अनुकूलन जो अनुमति दी है का उल्लेख है, और जो टूट जाता है "के रूप में यदि" नियम:

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

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

- एक फेंक-अभिव्यक्ति में, जब ऑपरेंड गैर-अस्थिर स्वचालित ऑब्जेक्ट (फ़ंक्शन या कैच-क्लॉज पैरामीटर के अलावा) का नाम है, जिसका दायरा आंतरिक के अंत से आगे नहीं बढ़ता है-कोशिश करें ब्लॉक जब एक अस्थायी वर्ग वस्तु है -, अपवाद वस्तु (15.1) के लिए संकार्य से कॉपी/कदम आपरेशन (यदि वहाँ एक है) स्वत: वस्तु अपवाद वस्तु

में सीधे निर्माण द्वारा छोड़ा जा सकता है एक संदर्भ (12.2) के लिए बाध्य नहीं किया गया है, उसी श्रेणी के साथ सीवी-अयोग्य प्रकार के साथ क्लास ऑब्जेक्ट में कॉपी/स्थानांतरित किया जाएगा, प्रतिलिपि/चाल ऑपरेशन को छोड़ा जा सकता है अस्थायी वस्तु छोड़े गए प्रतिलिपि का लक्ष्य में सीधे निर्माण/ले जाने के

- जब एक अपवाद हैंडलर (खण्ड 15) के अपवाद-घोषणा ( सीवी-योग्यता के लिए छोड़कर) एक ही प्रकार के एक वस्तु की घोषणा अपवाद ऑब्जेक्ट (15.1) के रूप में, प्रतिलिपि/चाल अपवाद को घोषणा के लिए उपनाम के रूप में अपवाद-घोषणा के इलाज के द्वारा छोड़ा जा सकता है यदि प्रोग्राम का अर्थ अपरिवर्तित होगा, तो रचनाकारों और विनाशकों के निष्पादन को छोड़कर अपवाद-घोषणा द्वारा घोषित ऑब्जेक्ट ।

1

"निर्दिष्ट व्यवहार" व्यवहार है जहां कार्यान्वयन किसी भी संभावित व्यवहार को चुनने के लिए स्वतंत्र है। ऐसे मामलों में, एक अनुकूलक पसंद की पसंद को प्रभावित कर सकता है।

एक साधारण उदाहरण वह क्रम है जिसमें फ़ंक्शन के तर्कों का मूल्यांकन किया जाता है। गैर-अनुकूलित बिल्ड बाएं से दाएं या दाएं से बाएं का उपयोग कर सकते हैं, जबकि अनुकूलित बिल्ड "मिश्रित" क्रम में तर्क का मूल्यांकन कर सकते हैं। एक अच्छा कारण तर्कों के बीच सामान्य Subexpression अनुकूलन के अवसर को अधिकतम करना होगा।

यदि इनमें से किसी भी तर्क के सापेक्ष साइड इफेक्ट्स हैं, तो कोड तर्क बदल दिया जाएगा, लेकिन क्या यह बग केस से मामले में भिन्न होता है।

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