मैंने अभी देखा कि हर आधुनिक OO प्रोग्रामिंग भाषा जिसे मैं कम से कम कुछ हद तक परिचित हूँ (जो मूल रूप से सिर्फ जावा, C # और D है) कोवरिएन्ट एरेज़ की अनुमति देता है। यह है, एक स्ट्रिंग सरणी एक वस्तु सरणी है:
Object[] arr = new String[2]; // Java, C# and D allow this
सहसंयोजक सरणियाँ स्थैतिक प्रकार प्रणाली में एक छेद हैं। वे टाइप त्रुटियों को संभव बनाते हैं, जिन्हें संकलन-समय पर पता नहीं लगाया जा सकता है, इसलिए किसी सरणी में प्रत्येक रनटाइम पर जांच की जानी चाहिए:
arr[0] = "hello"; // ok
arr[1] = new Object(); // ArrayStoreException
अगर मैं बहुत सारी सरणी स्टोर करता हूं तो यह एक भयानक प्रदर्शन हिट जैसा लगता है।
C ++ में सहसंयोजक सरणियाँ नहीं हैं, इसलिए ऐसे रनटाइम चेक करने की कोई आवश्यकता नहीं है, जिसका अर्थ है कि कोई निष्पादन जुर्माना नहीं है।
क्या रनटाइम चेक की संख्या कम करने के लिए कोई विश्लेषण आवश्यक है? उदाहरण के लिए, अगर मैं कहूं:
arr[1] = arr[0];
कोई यह तर्क दे सकता है कि स्टोर संभवतः विफल नहीं हो सकता। मुझे यकीन है कि मेरे द्वारा सोचा नहीं गए बहुत सारे अन्य संभावित अनुकूलन हैं।
क्या आधुनिक संकलक वास्तव में इस प्रकार के अनुकूलन करते हैं, या क्या मुझे इस तथ्य के साथ रहना होगा कि, उदाहरण के लिए, एक क्विकसॉर्ट हमेशा ओ (एन लॉग एन) अनावश्यक रनटाइम चेक करता है?
क्या आधुनिक OO भाषाएँ सह-वैरिएंट सरणियों का समर्थन करके बनाए गए ओवरहेड से बच सकती हैं?