2010-12-22 24 views
6

पर C++ ऑब्जेक्ट की स्मृति को कैसे निर्धारित करें I रनटाइम पर किसी ऑब्जेक्ट का आकार निर्धारित करने का प्रयास कर रहा हूं। आकार काम नहीं करता है क्योंकि यह संकलन समय पर आकार देता है। यहाँ मैं क्या मतलब का एक उदाहरण है:रनटाइम

class Foo 
{ 
public: 
    Foo() 
    { 
     c = new char[1024*1024*1024]; 
    } 
    ~Foo() 
    { 
     delete[] c; 
    } 

private: 
    char *c; 
}; 

इस मामले में, sizeof(Foo) 4 बाइट और नहीं ~ 1GB हो जाएगा। मैं रनटाइम पर फू का आकार कैसे निर्धारित कर सकता हूं? अग्रिम में धन्यवाद।

+1

संभव डुप्लिकेट [यदि मुफ़्त() मेरी सरणी की लंबाई जानता है, तो मैं इसे अपने कोड में क्यों नहीं पूछ सकता?] (Http://stackoverflow.com/questions/2650895/if-free-knows -the-length-of-my-array-why-cant-i-ask-for-it-in-my-own-code) –

+2

आप ऑब्जेक्ट के आकार को नियंत्रित स्मृति की मात्रा से अलग करना चाहते हैं वस्तु। आवंटन जिसे आप 'c'' पर इंगित कर रहे हैं, * ऑब्जेक्ट का हिस्सा कभी नहीं होगा। कक्षा 'फू' के ऑब्जेक्ट्स एक ही आकार होंगे (जो ऊपर दिए गए उदाहरण में डेटा पॉइंटर का आकार होगा)। यह थोड़ा पेडेंटिक है, लेकिन ... – dmckee

+0

'आकार का काम नहीं करता है क्योंकि यह संकलन समय पर आकार देता है।' - वास्तव में नहीं। कभी-कभी रनटाइम आकार होते हैं, खासकर सी 99 और जीसीसी में। (http://stackoverflow.com/questions/2615203/is-sizeof-in-c-evaluated-at-compilation-time-or-run-time/2709634#2709634) – osgx

उत्तर

5

आपको इसे किसी भी तरह से ट्रैक रखने की आवश्यकता है। उदाहरण के लिए:

struct Foo 
{ 
    Foo() 
     : elements(1024 * 1024 * 1024) 
    { 
     c.reset(new char[elements]); 
    } 

    boost::scoped_array<char> c; 
    int elements; 
}; 

ध्यान दें कि आप गतिशील रूप से आवंटित वस्तुओं के प्रबंधन के लिए एक स्मार्ट सूचक कंटेनर का उपयोग करना चाहिए ताकि आप मैन्युअल रूप से अपने जीवनकाल का प्रबंधन करने की जरूरत नहीं है। यहां, मैंने scoped_array का उपयोग प्रदर्शित किया है, जो एक बहुत उपयोगी कंटेनर है। आप shared_array का भी उपयोग कर सकते हैं या कस्टम डिलीटर के साथ shared_ptr का उपयोग कर सकते हैं।

+0

यह एक अच्छा जवाब है। हालांकि, मैं उन वस्तुओं के स्मृति उपयोग को निर्धारित करने का प्रयास कर रहा हूं जिन्हें मैंने स्वयं नहीं लिखा है। विशेष रूप से, एसटीएल स्ट्रिंग, एसटीएल wstring और आईसीयू यूनिकोडस्ट्रिंग सभी एक ही डेटा के साथ populated। प्रत्येक में ऐसे कार्य होते हैं जो आंतरिक बफर के आकार को वापस करते हैं लेकिन पूरे ऑब्जेक्ट का आकार नहीं। समस्या की जटिलता, इन वस्तुओं में पॉइंटर्स को अन्य डेटा में शामिल किया जा सकता है। कोई विचार? –

+0

@ डीआर। जय: आप अनुमान लगा सकते हैं, लेकिन यह सबसे अच्छा है जो आप कर सकते हैं। 'Std :: string' या 'std :: wstring' के लिए, आप उनके पास बफर के आकार को खोजने के लिए' s.size() 'प्राप्त कर सकते हैं (ध्यान दें कि यह वर्णों में है, इसलिए आपको गुणा करना होगा बाइट्स में आकार प्राप्त करने के लिए 'sizeof (wchar_t) 'द्वारा' wstring' के परिणाम का परिणाम) और इसे ऑब्जेक्ट' आकार 'के आकार में जोड़ें। अन्य प्रकार के लिए, आपको यह पता लगाना होगा कि क्या वे अपने आकार के आकार का पर्दाफाश करते हैं। वैसे भी, यह सिर्फ एक अनुमान है, क्योंकि अंतर्निहित बफर बड़ा हो सकता है (उदाहरण के लिए, 'वेक्टर' के लिए, 'v.capacity()' 'v.size()' से अधिक हो सकता है। –

5

फू का आकार स्थिर है। ~ 1 जीबी वर्ण तकनीकी रूप से वस्तु से संबंधित नहीं हैं, केवल इसके लिए सूचक है। वर्ण केवल वस्तु के स्वामित्व में ही कहा जाता है, क्योंकि वस्तु उनके लिए स्मृति आवंटित करने और हटाने के लिए ज़िम्मेदार है। सी ++ ऐसी सुविधाएं प्रदान नहीं करता है जो आपको यह पता लगाने की अनुमति देते हैं कि ऑब्जेक्ट कितनी मेमोरी आवंटित की गई है। आपको खुद का ट्रैक रखना होगा।

1

ऑब्जेक्ट का आकार आपके सिस्टम पर 4 बाइट्स है। ऑब्जेक्ट, हालांकि, 1 जीबी मेमोरी जैसे अतिरिक्त संसाधनों का उपयोग करता है।