2012-02-26 12 views
12

मैं कक्षा के आकार पर विस्तार विवरण जानना चाहता हूं। मैं जानना चाहता हूं कि क्या कोई डेटा वर्चुअल कीवर्ड & सदस्य फ़ंक्शन बिना वर्चुअल कीवर्ड के है, तो कक्षा का आकार केवल डेटा सदस्यों पर निर्भर करता है। एक उदाहरण के लिए:कक्षा का आकार केवल डेटा सदस्यों पर निर्भर करता है, न कि सदस्य कार्यों पर?

class A { 
    int a; 
public: 
    int display() { 
    cout << "A=" << a << endl; 
    } 
}; 

जब मैं sizeof(A) जाँच मैंने पाया है कि यह 4 बाइट है। जाने क्यों? क्लास ए के आकार पर सदस्य फ़ंक्शन का कोई प्रभाव क्यों नहीं है?

धन्यवाद

+0

[इस स्टैक ओवरफ्लो उत्तर] (http://stackoverflow.com/questions/9439240/sizeof-class-with-int-function-virtual-function-in-c) पर एक नज़र डालें। यह आपके संदेहों को साफ़ करना चाहिए। – vvnraman

उत्तर

13

क्योंकि वर्ग के कार्यों वस्तु के अंदर ही बचाया नहीं गया है। सी प्रोग्रामिंग के संदर्भ में इसके बारे में सोचें, कक्षा का प्रत्येक कार्य एक गुप्त पैरामीटर लेता है, यह पॉइंटर, इसलिए वास्तविकता में वे केवल एक अतिरिक्त पैरामीटर के साथ काम करते हैं।

उदाहरण के लिए इस तरह की कल्पना:

int display(A* thisptr) 
{ 
    //do something 
    printf("%d",thisptr->a); 
    return; 
} 

तो प्रदर्शन समारोह एक अतिरिक्त पैरामीटर के साथ सिर्फ एक सरल समारोह के रूप में सहेजा गया है। हालांकि कंपाइलर के आधार पर नाम उलझा हुआ है।

मेरा मानना ​​है कि विभिन्न नियम वर्चुअल फ़ंक्शंस के लिए लागू होते हैं जिनमें फ़ंक्शन पॉइंटर्स शामिल होंगे लेकिन चूंकि मुझे यकीन नहीं है कि कोई और इस मामले पर हमें ज्ञान दे सकता है।

2

एक नियमित सी फ़ंक्शन की तरह, एक सी ++ विधि निष्पादन के लिए स्मृति में केवल एक पता है जिसे कॉल करने के लिए कूदने के लिए किया जाता है। केवल अंतर पहला पैरामीटर है, जो ऑब्जेक्ट के लिए एक सूचक है जिसमें से आप फ़ंक्शन को कॉल कर रहे हैं।

4

यह कार्यान्वयन निर्भर है - यह मानक में निर्दिष्ट नहीं है। हालांकि, आप सही हैं, गैर वर्चुअल सदस्य फ़ंक्शन (और पहले के बाद भी वर्चुअल फ़ंक्शंस) कक्षा के आकार को प्रभावित नहीं करते हैं।

ऐसा इसलिए है क्योंकि कक्षा के प्रत्येक उदाहरण में सभी कार्यों के लिए पॉइंटर्स होंगे, तो यह बहुत मेमोरी का उपयोग करेगा। और वे क्यों? रनटाइम पर, ऑब्जेक्ट जानता है कि यह किस प्रकार का है, और यह उपयुक्त फ़ंक्शन को कॉल कर सकता है। और वही कार्य उदाहरणों के समान है, जो कुछ अलग है वह वह वस्तु है जिस पर यह चल रहा है, जिसे हुड के नीचे पैरामीटर के रूप में पारित किया जाता है।

1

क्योंकि फ़ंक्शन स्थिति स्टैक में जाती है, और फ़ंक्शन में प्रवेश/निकालने पर बनाई/हटा दी जाती है।

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

A a1, a2; 

a1.a के बारे में सोचो और a2.a अलग हैं, लेकिन a1.display() और a2.dispaly() एक ही समारोह कोड (int A::display() को लगता है) int display(A* this) के रूप में)

है
3

कार्य/विधियां कोड के रूप में संग्रहीत हैं, डेटा के रूप में नहीं। जैसे कि एक निष्पादन योग्य एकल फ़ाइल के रूप में संग्रहीत किया जाता है, और इसे कई बार लॉन्च किया जा सकता है - और इसके कई उदाहरणों में अलग-अलग डेटा होगा।इसी प्रकार, एक फ़ंक्शन है और निष्पादन योग्य कोड, और आपके द्वारा पारित डेटा अलग-अलग हो सकता है (जैसे विभिन्न शब्द-प्रोसेसिंग सॉफ़्टवेयर के लिए)।

निष्पादन योग्य कोड में sizeof नहीं होगा, क्योंकि वे स्टैक या ढेर पर स्थान नहीं लेते हैं, जबकि प्रोग्राम चल रहा है। यह निष्पादन योग्य छवि में स्वयं संग्रहित होता है, और जब आप प्रोग्राम लॉन्च करते हैं तो ओएस द्वारा एक बार लोड किया जाता है।

2

वर्चुअल फ़ंक्शंस और आभासी विरासत को लागू करने के लिए पेश किए गए छिपे हुए डेटा सदस्यों को छोड़कर, उदाहरण का आकार पूरी तरह से कक्षा के डेटा सदस्यों और बेस क्लास द्वारा निर्धारित किया जाता है। C++: Under the Hood (1 99 4) यदि आप और जानना चाहते हैं।

2

सदस्य कार्य प्रक्रिया के टेक्स्ट सेगमेंट का हिस्सा हैं और ऑब्जेक्ट प्रक्रिया के डेटा सेगमेंट का हिस्सा हैं। इसलिए वस्तुएं केवल डेटा हैं, यह कक्षा के सभी डेटा सदस्यों के आकार को जोड़कर आकार की गणना करती है। सदस्य कार्य सभी वस्तुओं के लिए आम हैं, यह केवल विशेष ऑब्जेक्ट पॉइंटर (जिसे इस पॉइंटर कहा जाता है) के पहले तर्क से भिन्न होता है जिसे कक्षा के प्रत्येक सदस्य समारोह में छुपा सूचक के रूप में पारित किया जाता है।

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

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