2010-09-26 18 views
10

में शुद्ध/कॉन्स फ़ंक्शन सी ++ 98/सी ++ 03 में, भाषा में pure/const function keywords नहीं हैं।सी ++ 0x

  1. क्या यह सी ++ 0x में बदल गया है?

  2. यदि हां, तो क्या फ़ंक्शन ऑब्जेक्ट्स (std::function) पर भी ऐसा ध्वज सेट करना संभव है? तो मैं कुछ फ़ंक्शन पॉइंटर या लैम्ब्डा फ़ंक्शन पास कर सकता हूं और अतिरिक्त जानकारी देता हूं कि यह एक शुद्ध/कॉन्स्ट फ़ंक्शन है? बुलाए गए फ़ंक्शन में ऐसे फ़ंक्शन के लिए एक अनुकूलित निष्पादन पथ हो सकता है।

  3. क्या यह जांचने का कोई तरीका है कि कोई दिया गया कार्य शुद्ध/स्थिर है या नहीं? अर्थात। उदाहरण के लिए, यदि ऊपर वर्णित अनुसार std::function पर ऐसा ध्वज है, तो शायद मैं उस ध्वज को देख सकता हूं। लेकिन शायद एक और सामान्य तरीका भी है।

यदि यह नहीं बदला है, तो क्यों नहीं? मुझे लगता है कि इस तरह के समर्थन के लिए यह काफी उपयोगी हो सकता है।

क्या इसके बारे में कोई खुला प्रस्ताव हैं?

+0

मैं साफ करने के लिए [टैग: शुद्ध] कोशिश कर रहा हूँ टैग - [मेटा देखें] (http://meta.stackexchange.com/questions/171779/what-is-the-pure-tag- के लिए) अधिक जानकारी के लिए। मुझे [टैग: सी ++] के बारे में बहुत कुछ पता नहीं है, तो क्या मैं इस प्रश्न और इस तरह के प्रश्नों के बारे में 'शुद्ध/const'' के बारे में अन्य टैग्स पर आपकी सलाह मांग सकता हूं? –

उत्तर

8
  1. क्या यह सी ++ 0x में बदल गया है?

नंबर एक constexpr नहीं है, लेकिन यह संकलन समय निरंतर का मतलब है। यदि इसके पैरामीटर constexprs भी हैं तो इसे संकलित समय पर निष्पादित किया जाता है, लेकिन यह नियमित रूप से एक नियमित कार्य है। चूंकि उन्हें एक ही अनुवाद इकाई में परिभाषित किया जाना चाहिए और एक एकल रिटर्न स्टेटमेंट शामिल होना चाहिए, इसलिए शायद उन्हें रेखांकित किया जाएगा और उपर्युक्त अनुकूलन किया जाएगा। इसका उपयोग बाहरी रूप से जुड़े फ़ंक्शन के बारे में कंपाइलर जानकारी प्रदान करने के लिए नहीं किया जा सकता है।

यदि यह नहीं बदला है, तो क्यों नहीं? मुझे लगता है कि इस तरह के समर्थन के लिए यह काफी उपयोगी हो सकता है।

वास्तव में मुझे नहीं लगता कि आपको इसकी आवश्यकता है। भाषा पहले से ही बहुत बड़ी है, और प्रोग्रामर आसानी से इस कोड को उसके ज्ञान के आधार पर अधिक कुशल होने के लिए फिर से लिख सकता है। restrict के विपरीत यह कोई भी जानकारी प्रदान नहीं करता है जिसे अन्य माध्यमों से व्यक्त नहीं किया जा सकता है।

क्या इसके बारे में कोई खुला प्रस्ताव हैं?

मैंने उस विषय पर कोई समिति के कागजात नहीं देखे हैं।

+0

जानकारी के लिए धन्यवाद। लेकिन शुद्ध/कॉन्स वास्तव में अधिक जानकारी प्रदान करेगा जो कुछ मामलों में बहुत जटिल हो सकता है/अन्यथा व्यक्त करना असंभव है। कंपाइलर भी पारदर्शी रूप से यादें जोड़ सकता है। – Albert

+1

@ अल्बर्ट: सी ++ में स्वचालित ज्ञापन होने की संभावना नहीं है। हालांकि, आप इसे अपने कार्यों में जोड़ सकते हैं। उदाहरण के लिए, 'std :: function 'पर निर्माण, संभवतः' my_memoized_function 'बनाना संभव है। – Potatoswatter

+1

@ अल्बर्ट: लेकिन आप केवल खुद को ज्ञापन लागू कर सकते हैं, इसलिए एक बार फिर, यह कुछ भी नहीं है जिसे अन्यथा व्यक्त नहीं किया जा सका। – jalf

6

जीसीसी __attribute__((<attr>)) का उपयोग extra attributes कार्यों पर परिभाषित करने के लिए करता है।

  • शुद्ध: केवल तक पहुँचता है (लेकिन संशोधित नहीं करता है) मानकों और वैश्विक स्मृति। जीसीसी इस जानकारी का उपयोग यह निर्धारित करने के लिए करता है कि क्या अनुकूलक फ़ंक्शन (स्थानीय-ज्ञापन) को बार-बार कॉल को पूरी तरह से छोड़ सकता है या नहीं। दो उल्लेखनीय शुद्ध कार्य strlen और memcmp हैं।

  • कॉन्स: सी ++ कॉन्स के साथ उलझन में नहीं, कॉन्स फ़ंक्शंस केवल पैरामीटर तक पहुंचता है और उन पैरामीटर पॉइंटर्स नहीं होना चाहिए।यह मूल रूप से pure का एक अधिक प्रतिबंधित संस्करण है। ऑप्टिमाइज़र const फ़ंक्शंस का व्यवहार करता है जो pure जैसा होता है। हालांकि सिद्धांत में यह pure के मुकाबले ज्यादा आक्रामक (गैर-स्थानीय) ज्ञापन कर सकता है।

सी ++ 11 की नई विशेषता वाक्यविन्यास (§7.6) को इस तरह की चीज़ करने के लिए डिज़ाइन किया गया था। वर्तमान में आप जीसीसी विशेषताओं को सेट करने के लिए सी ++ के गुण वाक्यविन्यास का उपयोग नहीं कर सकते हैं, लेकिन यह भविष्य के जीसीसी संस्करणों में बदल जाएगा।

तो आप विशेषता वाक्यविन्यास का उपयोग करके pure विशेषता को असाइन करने में सक्षम होंगे। लेकिन मानक pure विशेषता नहीं है। शुद्ध संकलक विशिष्ट होगा, लेकिन यह जीसीसी पर सही काम करेगा।

उत्सुक के लिए, यहाँ मानक विशेषताओं की सूची है:

  • संरेखित
  • noreturn
  • ओवरराइड
  • छुपा
  • base_check
  • carries_depend ency
+0

क्या अभी भी एक "ओवरराइड" विशेषता है, अब भी सी ++ 11 में एक स्पष्ट 'ओवरराइड' कीवर्ड है? – snogglethorpe

+0

'ओवरराइड', 'base_check', और' hiding' 'ओवरराइड कीवर्ड में घुमाया गया है। –