एक उदाहरण के रूप निम्नलिखित स्निपेट पर विचार करें:एक char * dereferencing सख्त एलियासिंग अनुकूलन अवरोध करता है?
*pInt = 0xFFFF;
*pFloat = 5.0;
क्योंकि वे int
और float
संकेत दिए गए हैं, संकलक वे अन्य नाम नहीं करते हैं और उदाहरण के लिए उन्हें विनिमय कर सकते हैं ग्रहण करेगा।
अब मान लेते हैं कि हम इसे को मसाले इस के साथ करते हैं:
*pInt = 0xFFFF;
*pChar = 'X';
*pFloat = 5.0;
char*
चूंकि यह *pInt
लेकर जा सकते हैं कुछ भी अन्य नाम पर अनुमति दी है, है, तो *pInt
असाइनमेंट *pChar
का काम परे नहीं ले जाया जा सकता है, क्योंकि यह वैध रूप से *pInt
पर इंगित कर सकता है और अपना पहला बाइट 'एक्स' पर सेट कर सकता है। इसी प्रकार pChar
*pFloat
पर इंगित कर सकता है, *pFloat
को असाइनमेंट को चार असाइनमेंट से पहले स्थानांतरित नहीं किया जा सकता है, क्योंकि कोड *pFloat
को पुन: असाइन करके पिछली बाइट सेटिंग के प्रभाव को कम करने का इरादा रख सकता है।
क्या इसका मतलब है कि मैं पुनर्नवीनीकरण और अन्य सख्त एलियासिंग संबंधित अनुकूलन के लिए बाधाओं को बनाने के लिए char*
के माध्यम से लिख और पढ़ सकता हूं?
यह [उदाहरण] (https://godbolt.org/g/k2yEzP) दिखाता है कि आपका अंतर्ज्ञान सही है (कम से कम उस कार्यान्वयन के लिए)। यदि आप असेंबली में उपयोग नहीं किए जाते हैं तो यह स्पष्ट नहीं हो सकता है कि पहले फ़ंक्शन के लिए '* ए = 1' को नीचे ले जाया गया है और' * a = * a + 1' के साथ विलय हो गया है। दूसरे मामले में, यह रोका गया है। –