2015-06-16 5 views
6

क्या सी ++ भाषा निम्नलिखित कोड को प्रिंट करने की अनुमति देती है उदा। 16 के बजाय 1? अन्य उत्तरों के मुताबिक मैं हां अनुमान लगाऊंगा लेकिन यह मामला विशेष रूप से कवर नहीं हुआ प्रतीत होता है।सी ++ कक्षा के अंदर संदर्भों के लिए भंडारण अनुकूलित किया जा सकता है?

यह अनिर्दिष्ट या नहीं, एक संदर्भ भंडारण

यह भी संकलक अप करने के लिए क्या तय करने के लिए है की आवश्यकता है:

#include "iostream" 
#include "cstdlib" 
using namespace std; 

struct as_array { 
    double &a, &b; 

    as_array(double& A, double& B) 
     : a(A), b(B) {} 

    double& operator[](const int i) { 
     switch (i) { 
     case 0: 
      return this->a; 
      break; 
     case 1: 
      return this->b; 
      break; 
     default: 
      abort(); 
     } 
    } 
}; 

int main() { 
    cout << sizeof(as_array) << endl; 
} 
+0

* "लेकिन यह मामला विशेष रूप से कवर नहीं किया गया प्रतीत होता है" * - विशेष रूप से आपके मामले के बारे में क्या आपको लगता है कि कवर नहीं किया गया था? बस संदर्भ वर्ग के सदस्य हैं? –

+1

क्या मुझे कुछ याद आ रही है? चूंकि 'ए' और 'बी' स्वतंत्र संदर्भ हैं, इसलिए कंपाइलर दो पॉइंटर्स के लिए स्थान आवंटित करने के अलावा, संरचना को कार्यान्वित कैसे करेगा? –

+0

> आपके मामले के बारे में विशेष रूप से क्या आपको लगता है कि कवर नहीं किया गया था? हाँ यह तथ्य था कि संदर्भ कक्षा सदस्य – user3493721

उत्तर

5

स्टैंडर्ड [dcl.ref] के तहत कहते हैं किसी ऑब्जेक्ट का आकार है, इसलिए आप यहां कोई गैर-शून्य नंबर प्राप्त कर सकते हैं।

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

यह सब कहकर; स्थिर एबीआई रखने के हित में मैं अभी भी उम्मीद करता हूं कि एक कंपाइलर इन संदर्भों को भंडारण निर्दिष्ट करता है।

2

जिस तरह से कंपाइलर संदर्भ व्यवहार लागू करता है - जिसमें कहां और कैसे संग्रहीत किया जाता है - C++ मानक में निर्दिष्ट नहीं है। नतीजतन, कुछ संकलक पूछते हैं कि "16 के बजाय 1 को प्रिंट करें" प्रिंट कर सकते हैं।

अलग-अलग, return आईएनजी के बाद आपको break की आवश्यकता नहीं है।

2

मुझे विश्वास है कि

cout << sizeof(as_array) << endl; 

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

double a=100; 
double b=200; 
as_array arr(&a, &b); 
std::cout << arr[0] << std::endl; 

, struct के लिए भंडारण पूरी तरह से दूर के अनुकूलन में परिणाम कर सकते हैं। लेकिन आकार (एआर) का प्रिंट अभी भी आपको संरचना का सैद्धांतिक आकार देता है।

वैसे भी: यदि आप बेहतर अनुकूलन परिणाम प्राप्त करना चाहते हैं, तो आपको बेहतर कोड लिखना चाहिए! const विधियां बनाएं यदि वे const हैं! यदि आप संभव हो तो सी ++ 11 उपयोग constexpr का उपयोग करें।

+1

क्या आपको विश्वास करने के लिए प्रेरित करता है? – juanchopanza

+1

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

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

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