2014-10-05 7 views
7

सी या सी ++ की तुलना में डी के उत्सुक पहलुओं में से एक यह है कि वैरिएबल डिफ़ॉल्ट रूप से प्रारंभ किए जाते हैं जब असाइनमेंट मान प्रदान नहीं किया जाता है।अनावश्यक डिफ़ॉल्ट प्रारंभिकरण छोड़े गए हैं?

int foo() { 
    int o; // int.init == 0 
    o++; 
    return o; // returns 1 
} 

C और C++, जो केवल संभावित कचरा के साथ चर छोड़ देता है के विपरीत, डी सुनिश्चित करें कि कचरा चर के लगभग सभी प्रकार से पढ़ा कभी नहीं रही है। हालांकि, इस सरल, केवल hypothetical समारोह पर विचार, ri पर सेट होने से पहले कभी नहीं पढ़ा जाता है, और यह निश्चित है कि असाइनमेंट अंततः होगा।

int foo2(int n) { 
    assert(n > 0 && n < 20); 
    int r; 
    for (int i = n ; ; i+=7) { 
     if (i % 3 == 0) { 
      r = i; 
      break; 
     } 
    } 
    return r; 
} 
  1. एक मामले में जहां यह निश्चित है कि एक चर, पिछले एक पढ़ने के बिना भविष्य में परिभाषित किया जाएगा डिफ़ॉल्ट प्रारंभ अभी भी क्या होगा, मानक के अनुसार?
  2. क्या यह डीएमडी/जीडीसी कंपाइलर्स से उन्हें ऑप्टिमाइज़ करने के लिए जाना जाता है (जैसे, डिफ़ॉल्ट प्रारंभिकरण को छोड़कर जब उस डिफ़ॉल्ट मान को चर से कभी नहीं पढ़ा जाता है)?
  3. यदि उपर्युक्त में से कोई भी नहीं है, तो क्या पर एक पूरी तरह से अनियमित वैरिएबल है?

उत्तर

7
  1. एक मामले में जहां यह निश्चित है कि एक चर, पिछले एक पढ़ने के बिना भविष्य में परिभाषित किया जाएगा डिफ़ॉल्ट प्रारंभ अभी भी क्या होगा, मानक के अनुसार?

के बाद से डी मूल्य प्रकार कंस्ट्रक्टर्स (डिफ़ॉल्ट struct कंस्ट्रक्टर्स) नहीं है, आरंभीकरण कोई साइड इफेक्ट नहीं होना चाहिए, इस प्रकार compilers इसे दूर अनुकूलन करने के लिए अनुमति दी जाती है। मेरा मानना ​​है कि यह मृत असाइनमेंट उन्मूलन का सबसेट है।

  1. यह डीएमडी/जीडीसी compilers से जाना जाता है उन्हें बाहर का अनुकूलन करने के (में, डिफ़ॉल्ट प्रारंभ मिटाने जैसी जब उस डिफ़ॉल्ट मान कभी नहीं चर से पढ़ा जाता है)?

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

  1. यदि उपरोक्त में से कोई भी, वहाँ है एक अच्छा काम के आसपास एक पूरी तरह से अप्रारंभीकृत चर होने के लिए?

हाँ: int r = void;

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