2009-02-17 21 views
23

एक वेक्टर के लिए एक सूचक होने के बजाय एक खाली वेक्टर होने की स्मृति ओवरहेड क्या है?खाली वेक्टर की ओवरहेड लागत क्या है?

विकल्प A:

std::vector<int> v; 

विकल्प बी:

std::vector<int> *v = NULL; 

मुझे विश्वास है कि विकल्प बी 1 32 बिट सूचक ले जाता है (यह मानते हुए 32 बिट यहाँ) कितना स्मृति खाली 'वी' करता है शुरू करो?

+0

यह जानना अच्छा होगा कि आप इस प्रश्न के साथ क्या प्राप्त करने की कोशिश कर रहे हैं। क्या आप उनमें से एक सरणी बनाना चाहते हैं, और जानना चाहते हैं कि आप पॉइंटर्स की एक सरणी बनाकर कितनी जगह बचाते हैं? यदि हां, तो शायद कुछ अन्य मुद्दे हैं जिनके बारे में आपको पता होना चाहिए। –

उत्तर

0

कार्यान्वयन निर्भर, शायद वर्तमान आकार और क्षमता के लिए एक सूचक और दो पूर्णांक।

5

std::vector v;sizeof(v) स्थान लेता है। यह कार्यान्वयन के द्वारा भिन्न हो सकता है, इसलिए इसे चलाएं और पता लगाएं कि यह आपके लिए कितना लेता है।

+0

और वेक्टर द्वारा आंतरिक रूप से उपयोग की जाने वाली गतिशील स्मृति के बारे में क्या? –

+1

एक डिफ़ॉल्ट निर्मित वेक्टर का कोई आकार नहीं है और कभी भी कोई नहीं था, इसलिए इसमें कोई गतिशील आवंटन नहीं होना चाहिए। –

12

यह पूरी तरह कार्यान्वयन-निर्भर है और आपको न तो विवरणों पर भरोसा करना चाहिए और न ही भरोसा करना चाहिए। वीसी का उपयोग करके 20-बाइट्स के लायक होने के लिए यह क्या है।

+0

जीसीसी 4.6 पर, यह 12 बाइट्स है। मैं सूचक के लिए 4 बाइट, आकार के लिए 4 बाइट और क्षमता के लिए 4 बाइट मानता हूं। – Joel

31

जैसा सवाल पूछा गया है: यह कार्यान्वयन पर निर्भर करता है। एमएसवीसी 7.1 के साथ यह:

std:: cout << sizeof(std::vector<int>) << std::endl; 

मुझे 16 (बाइट्स) देता है। (3 संकेत: शुरू करते हैं, अंत में, और क्षमता के अंत में, के साथ साथ एक संभाजक)

हालांकि यह ध्यान दिया जाना चाहिए कि सूचक करने वाली वेक्टर यह एक बड़ा भूमि के ऊपर देता है: दोनों समय में

  • और सभी मामलों में गैर-खाली मामले
  • में स्थान।
+3

आपका अंतिम बिंदु बहुत अच्छा है। उस –

+0

के लिए +1 पॉइंटर-टू-वेक्टर का बड़ा ओवरहेड क्यों होता है? –

+0

@Legate: चूंकि आपको पॉइंटर का आकार वेक्टर –

3

VS2005:

std::vector<int> *ptrToVec = new std::vector<int>(); 
std::vector<int> vecOfInt; 

sizeof(ptrToVec) = 4 
sizeof(vecOfInt) = 20 

धन्यवाद!

1

दृश्य स्टूडियो समुदाय 2017 (संस्करण 15.2) में, इस कोड चलाने:

#include <iostream> 
#include <vector> 

using namespace std; 

void main() 
{ 
    vector<float> test; 
    vector<float>* test2 = &test; 
    cout << sizeof(test) << "\n"; 
    cout << sizeof(test2) << "\n"; 

    cout << "\n"; 
    system("pause"); 
} 

32 बिट (x86) में चल रहा है, मैं वेक्टर के लिए 16 बाइट्स और वेक्टर सूचक के लिए 4 बाइट मिलता है।

64 बिट (x64) में चल रहा है, मुझे वेक्टर पॉइंटर के लिए वेक्टर के लिए 32 बाइट और 8 बाइट मिलते हैं।

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