2010-10-21 18 views
5

डेल्फी में, यदि मेरे पास एक चर myObject : MyClass है, और MyClass में ऐसी संपत्ति है जो इसमें 300 पूर्णांक वाले एक निश्चित-लंबाई सरणी है, तो इसके लिए स्मृति कब आवंटित की जाएगी?डेल्फी ऑब्जेक्ट मेमोरी आवंटन

  • जब myObject का दायरा दर्ज किया जाता है?
  • जब मैं myObject := MyClass.Create; (कन्स्ट्रक्टर) कहता हूं?

उत्तर

6

फिक्स्ड-लम्बाई सरणी इनलाइन आवंटित की जाती है, इसलिए यह माइक्लास के इंस्टेंस आकार के हिस्से के रूप में मौजूद है और जब आप कन्स्ट्रक्टर को कॉल करते हैं तो इसे आवंटित किया जाता है।

4

यदि आपका वास्तव में मतलब है कि ऑब्जेक्ट में संपत्ति है, तो इसके लिए कोई स्थान आवंटित नहीं किया गया है। गुणों को किसी अन्य प्रकार के पहुंच, या तो फ़ील्ड या फ़ंक्शन के लिए इंटरफेस सामान्यीकृत किया जाता है।

यदि संपत्ति ऑब्जेक्ट के किसी क्षेत्र द्वारा समर्थित है, तो as Mason explained, फ़ील्ड ऑब्जेक्ट के हिस्से के रूप में मौजूद है; सरणी की लंबाई सीधे ऑब्जेक्ट के कुल आकार को प्रभावित करती है (जैसा कि TObject.InstanceSize विधि द्वारा दिया गया है)। क्षेत्र में स्मृति है; संपत्ति नहीं है।

यदि संपत्ति किसी फ़ंक्शन द्वारा समर्थित है, तो फ़ंक्शन का रिटर्न मान आम तौर पर कॉलर के ढेर पर आवंटित हो जाता है और "var" पैरामीटर के रूप में पास किया जाता है। समारोह इसे भरता है और कॉलर पर लौटता है। फिर, संपत्ति के लिए आवंटित कोई स्मृति नहीं है।

आपके पास एक वस्तु पर सौ गुण हो सकते हैं जो केवल चार बाइट लंबा है (जो ऑब्जेक्ट्स के लिए न्यूनतम आकार है)।

यदि आप वास्तव में फ़ील्ड का मतलब रखते हैं, तो इसे TObject.NewInstance पर कॉल के दौरान ऑब्जेक्ट के हिस्से के रूप में आवंटित किया जाता है। उस विधि को बाहरी कन्स्ट्रक्टर के प्रस्तावना के हिस्से के रूप में जाना जाता है (जैसा कि विरासत रचनाकारों को किसी भी कॉल के विपरीत)।

0

इंस्टेंस बनने पर सभी गुण सामग्री आवंटित की जाएंगी।

TClassName से पहले। क्रिएट कॉल, स्टैक में केवल पॉइंटर उपलब्ध है या जहां इसे घोषित किया गया था: केवल 4 बाइट्स।

जब बनाएं विधि कहा जाता है, TObject.Newinstance विधि निष्पादित होने

class function TObject.NewInstance: TObject; 
begin 
    Result := InitInstance(_GetMem(InstanceSize)); 
end; 

आकार वापस आ जाएगी (बाइट्स में) InstanceSize विधि सब निश्चित-आकार (उर्फ स्थिर) वर्ग के गुणों से युक्त ।

आपके 300 पूर्णांक इस GetMem कॉल के माध्यम से ढेर से पुनर्प्राप्त किए जाएंगे। कुछ और मेमोरी की आवश्यकता है (विरासत गुण और क्लास प्रकार और वीएमटी जैसे कुछ डिफ़ॉल्ट मान)।

+0

यह गलत है। जब ऑब्जेक्ट बनाया जाता है तो ऑब्जेक्ट के सभी * फ़ील्ड * आवंटित किए जाएंगे। यह किसी संपत्ति के लिए जरूरी नहीं है क्योंकि इसमें गेटटर और सेटर विधियां हो सकती हैं जिन्हें निर्माण समय पर आवंटित करने के लिए किसी भी स्मृति की आवश्यकता नहीं होती है। – dummzeuch

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