जितना मैं सी और सी ++ से प्यार करता हूं, मैं मदद नहीं कर सकता, लेकिन अशक्त समाप्ति के विकल्प पर अपना सिर खरोंच कर सकता हूं:
- लंबाई पहले (यानी पास्कल) तार सी के पहले मौजूद थी
- लंबाई के पहले से लगे हुए तार कई एल्गोरिदम को निरंतर समय लंबाई देखने की अनुमति देकर तेजी से बनाते हैं।
- लंबाई उपसर्गों की स्ट्रिंग बफर त्रुटि उत्पन्न करने के लिए इसे और अधिक कठिन बनाती है।
- यहां तक कि एक 32 बिट मशीन पर, यदि आप स्ट्रिंग को उपलब्ध स्मृति के आकार की अनुमति देते हैं, तो एक लंबाई उपसर्ग स्ट्रिंग केवल तीन बाइट्स है जो एक शून्य समाप्त स्ट्रिंग से अधिक व्यापक है। 16 बिट मशीनों पर यह एक सिंगल बाइट है। 64 बिट मशीनों पर, 4GB एक उचित स्ट्रिंग लंबाई की सीमा है, लेकिन भले ही आप इसे मशीन शब्द के आकार में विस्तारित करना चाहते हैं, 64 बिट मशीनों में आमतौर पर अतिरिक्त सात बाइट्स एक अशक्त तर्क की तरह पर्याप्त स्मृति होती है। मुझे पता है कि मूल सी मानक पागलपन वाली मशीनों (स्मृति के संदर्भ में) के लिए लिखा गया था, लेकिन दक्षता तर्क मुझे यहां नहीं बेचता है।
- बहुत अधिक हर दूसरी भाषा (यानी पर्ल, पास्कल, पायथन, जावा, सी #, आदि) लंबाई उपसर्गों का उपयोग करती है। ये भाषाएं आमतौर पर स्ट्रिंग हेरफेर बेंचमार्क में सी को हरा देती हैं क्योंकि वे स्ट्रिंग के साथ अधिक कुशल हैं।
- C ++ ने इसे
std::basic_string
टेम्प्लेट के साथ थोड़ा ठीक किया , लेकिन अशक्त समाप्त होने वाले तार की अपेक्षा करने वाले सादे वर्ण सरणियाँ अभी भी व्याप्त हैं। यह भी अपूर्ण है क्योंकि इसमें ढेर आवंटन की आवश्यकता होती है। - अशक्त समाप्त तारों को एक वर्ण (अर्थात्, अशक्त) को आरक्षित करना पड़ता है, जो स्ट्रिंग में मौजूद नहीं हो सकता है, जबकि लंबाई के उपसर्गों में अंतर्निहित नल हो सकते हैं।
इनमें से कई चीजें हाल ही में सी की तुलना में अधिक प्रकाश में आई हैं, इसलिए यह सी के लिए समझ में नहीं आएगा उनके बारे में पता नहीं है। हालांकि, सी होने से पहले कई सादे थे। क्यों स्पष्ट रूप से बेहतर लंबाई उपसर्ग के बजाय अशक्त तार को चुना जाएगा?
संपादित करें : चूंकि कुछ लोगों ने मेरे दक्षता बिंदु पर उपरोक्त तथ्यों (और पहले से उपलब्ध कराए गए लोगों को पसंद नहीं किया), वे कुछ चीजों से उपजी हैं:
- शून्य समाप्त स्ट्रिंग्स का उपयोग करने वाले कॉनैट को ओ (एन + एम) समय की जटिलता की आवश्यकता होती है। लंबाई उपसर्ग अक्सर केवल ओ (एम) की आवश्यकता होती है।
- शून्य समाप्त स्ट्रिंग्स का उपयोग करने वाली लंबाई के लिए O (n) समय की जटिलता की आवश्यकता होती है। लंबाई उपसर्ग हे (1) है।
- लंबाई और समतल अब तक के सबसे आम स्ट्रिंग ऑपरेशन हैं। ऐसे कई मामले हैं जहां अशक्त तार अधिक कुशल हो सकते हैं, लेकिन ये अक्सर कम होते हैं।
नीचे दिए गए जवाबों से, ये कुछ ऐसे मामले हैं जहाँ अशक्त तार अधिक कुशल हैं:
- जब आपको एक स्ट्रिंग की शुरुआत में कटौती करने की आवश्यकता होती है और इसे किसी विधि से पास करने की आवश्यकता होती है। यदि आप मूल स्ट्रिंग को नष्ट करने की अनुमति देते हैं, तो आप वास्तव में लगातार लम्बाई के साथ निरंतर समय में ऐसा नहीं कर सकते, क्योंकि लंबाई उपसर्ग को शायद संरेखण नियमों का पालन करने की आवश्यकता होती है।
- कुछ मामलों में जहां आप केवल चरित्र द्वारा स्ट्रिंग चरित्र के माध्यम से लूप कर रहे हैं आप सीपीयू रजिस्टर को बचाने में सक्षम हो सकते हैं। ध्यान दें कि यह केवल उस मामले में काम करता है जिसे आपने गतिशील रूप से स्ट्रिंग आवंटित नहीं किया है (क्योंकि तब आपको इसे मुक्त करना होगा, आवश्यक उस सीपीयू रजिस्टर का उपयोग करके जिसे आपने मूल रूप से मॉलोक और दोस्तों से प्राप्त सूचक को बचाने के लिए बचाया था)।
उपरोक्त में से कोई भी लंबाई और कंकट के रूप में लगभग आम नहीं है।
नीचे दिए गए उत्तरों में एक और जोर दिया गया है:
- आपको स्ट्रिंग के अंत में कटौती करने की आवश्यकता है
लेकिन यह एक गलत है - यह शून्य समाप्त और लंबाई उपसर्गों के लिए एक ही समय है। (शून्य समाप्त किए गए तार सिर्फ एक नल को चिपकाते हैं जहां आप नया अंत चाहते हैं, लंबाई उपसर्ग केवल उपसर्ग से घटाते हैं।)