मैं सी ++ में एक प्रकार-अज्ञेय वेक्टर बनाने का प्रयास कर रहा हूं जो दो चीजों से अलग है। सबसे पहले, यह ढेर पर वस्तुओं की वास्तविक सरणी को बनाए रखने के बजाय, कम से कम एक निश्चित बिंदु तक, वस्तु में स्मृति को आवंटित करता है। दूसरा, यह सी ++ की कॉपी/असाइन कन्स्ट्रक्टर का उपयोग नहीं कर सकता है, जो कोड को धीमा करने लगता है और आवश्यक नहीं है।सी ++ ऑब्जेक्ट उदाहरणों को ले जाने/कॉपी करने पर
कोडबेज के माध्यम से देखकर मैं अपने कंप्यूटर पर रखता हूं, मुझे एलएलवीएम के कोडबेस में एक कक्षा मिली है जो मैं देख रहा हूं कि काफी कुछ पूरी तरह से वर्णन करता है: SmallVector.h। सी ++ के अपेक्षाकृत नए होने के नाते, मुझे पूरा यकीन नहीं है कि कुछ डिज़ाइन निर्णय क्यों किए गए थे। उदाहरण के लिए, के बजाय U
के संदर्भ में सरणी आवंटित क्यों की जाती है? टिप्पणी एक सुराग देता है:
यदि टी में एक सीटीओआर या डीटीआर है, तो हम नहीं चाहते हैं कि यह स्वचालित रूप से चलाना पड़े, इसलिए हमें अंतरिक्ष को कुछ और के रूप में प्रस्तुत करने की आवश्यकता है। चार का एक सरणी बहुत अच्छा काम करेगा, लेकिन पर्याप्त रूप से गठबंधन नहीं किया जा सकता है। इसके बजाय हम अंतरिक्ष के लिए कुछ यूनियन उदाहरणों का उपयोग करते हैं, जो अधिकतम संरेखण की गारंटी देते हैं।
U
, ज़ाहिर है, निम्नलिखित संघ को दर्शाता है:
union U {
double D;
long double LD;
long long L;
void *P;
} FirstEl;
तो, मुझे लगता है कि, यहाँ मेरा सच्चा सवाल कर रहे हैं: क्यों T
की एक सरणी का आवंटन करता है न दर्शाएं कि कंस्ट्रक्टर्स/विनाशकर्ता कहा जाता है? क्या इन रचनाकारों/विनाशकों को बुलाए बिना, वेक्टर के अंदर और बाहर सी ++ ऑब्जेक्ट उदाहरणों को स्थानांतरित करने का कोई तरीका है? मुझे लगता है कि मैं सिर्फ एलएलवीएम के SmallVector
कार्यान्वयन का उपयोग कर सकता हूं, लेकिन मुझे समझने के बिना कोड का उपयोग करने से नफरत है।
बेस्ट, डुआन
'सी ++ की कॉपी/असाइन कन्स्ट्रक्टर, जो कोड को धीमा करने के लिए प्रतीत होता है ... 'यह _correct_ कोड बनाता है, क्योंकि वे _are_ आवश्यक हैं। ऐसी कई कक्षाएं हैं जो क्रैश हो जाएंगी यदि उन्हें कभी भी याद किया जाता है, और _not_ में डिफ़ॉल्ट कन्स्ट्रक्टर नहीं होता है। –