2010-02-08 14 views
7

साल पहले मुझे विश्वास था कि सी सी ++ की तुलना में बिल्कुल शुद्ध था क्योंकि संकलक कोई भी कोड उत्पन्न नहीं कर सका जिसे आप भविष्यवाणी नहीं कर सके। अब मुझे लगता है कि काउंटर उदाहरणों में volatile कीवर्ड और मेमोरी बाधाएं शामिल हैं (मल्टीप्रोसेसर प्रोग्रामिंग या मेमोरी मैप किए गए हार्डवेयर उपकरणों के लिए डिवाइस ड्राइवरों में, जहां सादा असेंबली भाषा सी संकलक के अनुकूलन से भी अधिक शुद्ध होगी)।सी ++ में गलती से अस्थायी वस्तुओं को बनाने के तरीके?

फिलहाल मैं अप्रत्याशित चीजों की गणना करने की कोशिश कर रहा हूं, एक सी ++ कंपाइलर कर सकता है। सी ++ के बारे में मेरे दिमाग में चिपकने वाली मुख्य शिकायत यह है कि संकलक अस्थायी रूप से अस्थायी वस्तुओं को तुरंत चालू करेगा, लेकिन मेरा मानना ​​है कि इन मामलों की सभी उम्मीद की जा सकती है। मामलों मैं सोच रहा हूँ कर रहे हैं:

  • जब एक वर्ग एक प्रकार खुद के अलावा किसी अन्य के लिए एक प्रतिलिपि निर्माता को परिभाषित करता है, explicit कीवर्ड
  • का उपयोग करते समय एक वर्ग एक ओवरलोड रूपांतरण ऑपरेटर को परिभाषित करता है बिना: operator()
  • जब एक समारोह मूल्य के बजाय संदर्भ द्वारा किसी वस्तु को स्वीकार करता है
  • एक समारोह मूल्य के बजाय संदर्भ

द्वारा एक वस्तु देता है जब कर रहे हैं किसी और को फिर से?

+0

+1: दिलचस्प जब यह एम्बेडेड सिस्टम के लिए आता है। – jldupont

+3

ये सभी मानक में परिभाषित हैं और इसलिए भविष्यवाणी की जा सकती है - जिनकी भविष्यवाणी नहीं की जा सकती है वे अनिर्धारित व्यवहार – Mark

+1

सी में आपके पास अंतर्निहित रूपांतरण हैं (इसलिए), इसलिए मैं यह नहीं कहूंगा कि यह "शुद्ध" है। – Manuel

उत्तर

2

मुझे लगता है कि "अप्रत्याशित" का अर्थ है "मानक के अनुसार कुछ लेकिन प्रोग्रामर को कोड लिखते समय क्या अपेक्षा करता है उससे अलग", है ना?

मुझे लगता है कि आप उस कोड से देख सकते हैं जहां वस्तुओं को तत्काल या प्रतिलिपि बनाई जा रही है, भले ही यह स्पष्ट न हो। यद्यपि समझना मुश्किल हो सकता है।

कुछ सामान केवल कुछ तरीकों से (सभी?) कंपाइलर विक्रेताओं द्वारा लागू किया गया है, लेकिन यह अलग-अलग किया जा सकता है। उदा।, देर से बाध्यकारी (उर्फ। ओवरलोडेड, आभासी विधि) को कॉल करना आमतौर पर पृष्ठभूमि में फ़ंक्शन पॉइंटर्स का उपयोग करके कार्यान्वित किया जाता है। यह शायद यह सबसे तेज़ तरीका है, लेकिन मुझे लगता है कि यह अलग-अलग किया जा सकता है और यह अप्रत्याशित होगा। मैं किसी भी कंपाइलर को नहीं जानता हालांकि यह अलग-अलग करता है।

बहुत सी चीजें अप्रत्याशित रूप से इस अर्थ में अप्रत्याशित हैं कि सी ++ अत्यधिक जटिल है - शायद ही कोई पूरी भाषा को समझता है। तो अप्रत्याशित भी आपके ज्ञान पर निर्भर करता है।

+0

+1। –

2

12,2 अस्थायी वस्तुओं वर्ग प्रकार के

1 temporaries विभिन्न संदर्भों में बनाया रहे हैं: बाध्यकारी एक rvalue एक संदर्भ (8.5.3), एक rvalue (6.6.3) लौटने के लिए, एक रूपांतरण जो (4.1, 5.2.9, 5.2.11, 5.4) बनाता है, अपवाद (15.1) फेंकने, एक हैंडलर (15.3) में प्रवेश करता है, और कुछ प्रारंभिकताओं में (8.5)।

4 दो संदर्भों जिसमें temporaries fullexpression के अंत की तुलना में एक भिन्न स्थिति में नष्ट कर रहे हैं कर रहे हैं।

वास्तव में मेरा सुझाव है कि पूरे 12 पर एक नज़र डालें।2

फिलहाल मैं अप्रत्याशित चीजें एक सी ++ संकलक क्या कर सकते हैं की गणना करने में कोशिश कर रहा हूँ। मुख्य शिकायत जो सी ++ के बारे में मेरे दिमाग में चिपक जाती है है कि संकलक तत्काल अस्थायी वस्तुओं को तत्काल करेगा, लेकिन मैं मानता हूं कि ये मामले अपेक्षित हो सकते हैं।

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

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