2010-05-31 5 views
6

मैंने निबंध Surviving the Release Version पढ़ा है।सी ++ परिवर्तनीय उपनाम - यह वास्तव में क्या है, और अगर बंद करना बंद करना बेहतर क्यों है?

"एलियासिंग बग" खंड के तहत यह कहते हैं:

आप तंग कोड प्राप्त कर सकते हैं अगर आप संकलक है कि यह कोई अलियासिंग मान सकते हैं बताओ ....

मैं Aliasing (computing) भी पढ़ा है।

एक परिवर्तनीय उपनाम क्या है? मैं समझता हूं कि इसका मतलब है कि एक चर के लिए पॉइंटर का उपयोग करना एक उपनाम है, लेकिन, यह कैसे/क्यों बुरी तरह प्रभावित होता है, या दूसरे शब्दों में - क्यों संकलक को बताता है कि यह कोई एलियासिंग नहीं ले सकता है मुझे एक "कड़ा कोड"

उत्तर

5

एलियासिंग को अस्वीकार करने का मतलब है कि यदि आपके पास सूचक char* b है, तो आप यह मान सकते हैं कि बी प्रोग्राम में एकमात्र सूचक है जो उस विशेष मेमोरी लोकेशन को इंगित करता है, जिसका मतलब है कि मेमोरी लोकेशन बदलने का एकमात्र समय है जब प्रोग्रामर b का उपयोग करता है बदल दें। इस प्रकार जेनरेट असेंबली को b द्वारा इंगित स्मृति को फिर से लोड करने की आवश्यकता नहीं है जब तक कि संकलक जानता है कि इसे संशोधित करने के लिए b का उपयोग नहीं किया गया है। अगर एलियासिंग की अनुमति है तो यह संभव है कि एक और सूचक char* c = b; है जिसे उस स्मृति के साथ गड़बड़ करने के लिए कहीं और इस्तेमाल किया गया था

+0

"जेनरेट असेंबली को इस प्रकार बी द्वारा इंगित स्मृति को पुनः लोड करने की आवश्यकता नहीं है ..."। मुझे बस इतना ही चाहिए, धन्यवाद। असल में, आपका जवाब पढ़ने के बाद, केवल तभी मैं वास्तव में शमूएल के जवाब को समझ गया, जैसा कि तुम्हारा पहेली पूरा करने जैसा था। तब आप दोनों का धन्यवाद !! – Poni

12

एलिसिंग तब होती है जब आपके पास समान अंतर्निहित स्मृति के दो अलग-अलग संदर्भ होते हैं। इस बना उदाहरण पर विचार करें: संकलक अलियासिंग के लिए अनुमति देने के लिए है

int doit(int *n1, int *n2) 
{ 
    int x = 0; 

    if (*n1 == 1) 
    { 
     *n2 = 0; 

     x += *n1 // line of interest 
    } 

    return x; 
} 

int main() 
{ 
    int x = 1; 

    doit(&x, &x); // aliasing happening 
} 

हैं, तो यह संभावना है कि n1 == n2 पर विचार करने की जरूरत है। इसलिए, जब इसे "ब्याज की रेखा" पर *n1 के मान का उपयोग करने की आवश्यकता होती है, तो उसे *n2 = 0 लाइन द्वारा बदलने की संभावना की अनुमति देने की आवश्यकता होती है।

यदि कंपाइलर कोई एलियासिंग नहीं ले सकता है, तो यह *n1 == 1 (क्योंकि अन्यथा हम if के अंदर नहीं होंगे) पर "रुचि की रेखा" पर विचार कर सकते हैं। ऑप्टिमाइज़र तब कोड को अनुकूलित करने के लिए इस जानकारी का उपयोग कर सकता है (इस मामले में, पॉइंटर का पालन करने से "ब्याज की रेखा" बदलें और सरल वृद्धि का उपयोग करने के लिए सामान्य उद्देश्य जोड़ना)।

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