2012-03-16 10 views
8

पॉइंटर शून्य होने पर ऑपरेटर स्वयं को चेक कर देता है। क्या कोई प्रदर्शन करने के बिना किसी नलप्टर पर डिलीट करते समय कोई प्रदर्शन ओवरहेड होता है?नलप्टर हटाने - प्रदर्शन ओवरहेड?

delete ptr; 

या

if (ptr != nullptr) delete ptr; 

ऊपर कार्यान्वित करता है, तो तेजी से ptr nullptr में से कौन?

+7

उत्तरार्द्ध अनावश्यक है, इसलिए संभावित गति अंतर अलग है, यह बदतर है। – ildjarn

उत्तर

18

सामान्य रूप से, यह संकलक पर निर्भर करता है।

मैं एमएसवीसी का उपयोग करता हूं, जो इन दोनों लाइनों को बिल्कुल उसी कोड में संकलित करता है।

नियम कहते हैं कि यदि सूचक शून्य है, तो डिलीट का कोई प्रभाव नहीं पड़ता है। तो यदि आप इसे चेक नहीं करते हैं, तो संकलक को वैसे भी करना होगा।

2

यह निश्चित रूप से अनुकूलन का एक मामला है। किसी भी आधुनिक प्रोसेसर पर, अंतर कुछ नैनोसेकंड है।

चेक करके, कोड कॉल के ओवरहेड (डिलीवरी लाइब्रेरी दिनचर्या में) से बचाता है। 99% मामलों में, स्रोत कोड की थोड़ी अतिरिक्त जटिलता (ब्रेसिज़, संभावित टाइपो लेखन !=, आदि) अतिरिक्त निष्पादन समय की तुलना में अधिक समस्या है।

+0

लाइब्रेरी ':: ऑपरेटर डिलीट()' पर कॉल करने से पहले जेनरेट कोड में चेक होना चाहिए, क्योंकि संकलक को विनाशक को कॉल करने की अनुमति नहीं है, या तो, यदि सूचक 'शून्य' है। –

2

नहीं, जब आप यह जांच नहीं करते हैं कि ptrnullptr है तो कोई ओवरहेड नहीं है।

यदि आप मैन्युअल रूप से चेक करते हैं, तो वही चेक दो बार किया जाता है, हालांकि यह नगण्य है, सिस्टम कॉल की लागत की तुलना में, आप उम्मीद कर सकते हैं कि ptr शून्य नहीं है।

+3

इसके अलावा, यदि आप पहले से ही C++ 11 का उपयोग करते हैं, तो शायद डिलीट का उपयोग न करने पर विचार करें और इसके बजाय स्मार्ट पॉइंटर्स का उपयोग करें? –

+1

सी ++ 11 आवश्यक नहीं है - बूस्ट के वर्षों के लिए अच्छे स्मार्ट पॉइंटर्स हैं। : -] – ildjarn

+0

बेशक! लेकिन जब वे आपके हाथ में झूठ बोलते हैं, तो आपके पास अधिकतर मानक मामलों में उनका उपयोग न करने के लिए कोई बहाना नहीं है :) –

2

यदि उपरोक्त में से कौन सा उपरोक्त निष्पादित होता है तो पीआरटी नलप्टर होता है?

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

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