2013-02-22 59 views
12

मैं एक दसवीं कक्षा केवल 2 सार्वजनिक कार्यों (निर्माता और नाशक) होने, और sizeof ऑपरेटर का उपयोग वर्ग के आकार होने के लिए 1.सी ++ आकार के ऑपरेटर आकार की गणना कैसे करता है?

जब मैं ऊपर वर्ग घोषणा करने के लिए प्रकार char के एक निजी डेटा सदस्य जोड़ने आ रहा है बनाया , आकार अभी भी है 1. अंततः मैं कक्षा डेटा सदस्य के रूप में इसे एक पूर्णांक प्रकार जोड़ता हूं, और अब आकार 8 बाइट्स है।

कृपया मुझे बताएं कि कक्षा के आकार की गणना कैसे की जाती है।

+0

को ढूंढ सकते हैं प्रासंगिक कोड पोस्ट। –

उत्तर

23

सबसे पहले, यह समझें कि वर्चुअल नहीं होने वाले कार्यों का वर्ग के आकार पर कोई प्रभाव नहीं पड़ता है।

के उदाहरण का आकार वर्ग कम से कम 1 बाइट है, भले ही कक्षा खाली हो, ताकि विभिन्न वस्तुओं के अलग-अलग पते हों।

char जोड़ना सुनिश्चित करता है कि अलग-अलग वस्तुओं के अलग-अलग पते होंगे, इसलिए संकलक कृत्रिम रूप से आकार में एक नहीं जोड़ता है। आकार sizeof(char) = 1.

फिर आप int जोड़ते हैं, जो (संभवतः) आपके प्लेटफ़ॉर्म पर 4 बाइट जोड़ता है। संकलक तब क्लास को पैड करने का निर्णय लेता है ताकि इसे प्रदर्शन/सीपीयू-आवश्यकता के कारणों के लिए गठबंधन किया जा सके और 3 खाली बाइट्स जोड़े जाए ताकि आकार अब 1 + 3 + 4 = 8. हो। यह शायद int सदस्य से पहले पैडिंग जोड़ता है कि इसे 4 बाइट सीमा पर गठबंधन किया जाएगा, लेकिन जब तक आपके सीपीयू की आवश्यकता नहीं होती है तब तक इसकी आवश्यकता नहीं होती है।

आप the Wikipedia page पर पैडिंग के बारे में पढ़ सकते हैं।

+2

मैं उम्मीद करता हूं कि यह 'ciiii ---' की बजाय 'c --- iiii' होगा, क्योंकि इस उत्तर का तात्पर्य है। – zch

+4

@zch मेरा मतलब यह नहीं था कि यह संकलक तक है। लेकिन मैं जोड़ के क्रम को बदल दूंगा और एक नोट जोड़ दूंगा अगर यह कम उलझन में लग रहा है। –

+0

स्पष्टीकरण के लिए बहुत कुछ @ सेठ कार्नेगी धन्यवाद। मुझे पैडिंग के बारे में थोड़ा पता है, इसमें गहराई से खड़ा होगा क्योंकि मुझे कोई संदेह नहीं है कि सीमा में 4 बाइट होने पर भी केवल एक चार घोषित किए जाने पर कोई पैडिंग क्यों नहीं होती है। :) – user2100866

8

ऐसे कई कारक हैं जो सी ++ में कक्षा के किसी ऑब्जेक्ट का आकार तय करते हैं। ये कारक हैं:

  1. सभी गैर-स्थिर डेटा सदस्यों के आकार
  2. डेटा सदस्यों के आदेश
  3. बाइट संरेखण या बाइट गद्दी
  4. इसके तत्काल आधार वर्ग के
  5. आकार
  6. आभासी समारोह के अस्तित्व (एस) (आभासी कार्यों का उपयोग कर गतिशील बहुरूपता)।
  7. संकलक इस्तेमाल किया जा रहा विरासत (आभासी विरासत) की
  8. मोड

आप यहाँ और अधिक http://www.cprogramming.com/tutorial/size_of_class_object.html