C ++ में क्लास का आकार डेटा सदस्यों की सार्वजनिक / निजी स्थिति पर क्यों निर्भर करता है?


23

मुझे क्या पता है, c ++ में एक वर्ग का आकार नीचे के कारकों पर निर्भर करता है -

  1. सभी गैर-स्थैतिक डेटा सदस्यों का आकार।
  2. डेटा सदस्यों का आदेश।
  3. यदि बाइट पैडिंग सक्षम है या नहीं।
  4. इसके तत्काल आधार वर्ग का आकार।
  5. आभासी कार्यों का अस्तित्व।
  6. वंशानुक्रम की विधि (वर्चुअल इनहेरिटेंस)।

अब मैंने नीचे 2 वर्ग बनाए हैं -

class A{
    int a;
    short s;
    int b;
    char d;
};// kept a char at last on purpose to leave a "hole"

class B : public A{
    char c;  
};

अब A और BI के आकार की जाँच करें

  • A का आकार: 16
  • बी का आकार: 16

मेरी धारणा है कि कक्षा B में चार सी को "A" में समायोजित किया गया है, कक्षा A में छोड़ दिया गया है।

लेकिन, व्हाट्स ने मुझे उलझन में डाल दिया है कि मैं किस सदस्य को सार्वजनिक करूं

class A{
    public:
    int a;
    short d;
    int b;
    char s;
};

class B : public A{
    public:
    char c;
};

अब आकार बन जाता है

  • A का आकार: 16
  • बी का आकार: २०

मैं इस अंतर का कारण नहीं समझ सकता।


1
C ++ में वर्ग का आकार डेटा सदस्यों की सार्वजनिक / निजी स्थिति पर क्यों निर्भर करता है? - यह है। वे संकलक-निर्भर कार्यान्वयन विवरण हैं।
पॉलमैकेन्जी

1
तो आप क्या संकलक का उपयोग कर रहे हैं?
रेमन नोव

2
@PaMMcKenzie वास्तव में यह करता है। समान पहुंच वाले मानक जनादेश सदस्यों को एक साथ बदलते हुए मिल जाते हैं जिससे संकलक की गद्दी रणनीति बदल जाएगी।
नेथनऑलिवर

@ NathanOliver-ReinstateMonica, मुझे नहीं पता था कि। क्या आपके पास किसी भी मौके से संबंधित प्रासंगिक अनुभाग का संदर्भ है?
आर साहू

@RSahu अब मेरे जवाब में तंग करने के लिए इसे देख रहा है।
नाथनऑलिवर

जवाबों:


8

Itanium ABI उन कक्षाओं को परिभाषित करने के लिए POD की C ++ 03 परिभाषा का उपयोग करता है जो "लेआउट के प्रयोजनों के लिए POD" हैं। निजी डेटा सदस्य होने से एक वर्ग को कुल मिलाकर अयोग्य घोषित कर दिया जाता है और इसलिए C ++ 03 में POD:

एक POD- संरचना एक समग्र वर्ग है जिसमें गैर-POD- संरचना, गैर-POD- संघ (या इस प्रकार के सरणी) या संदर्भ के कोई गैर-स्थैतिक डेटा सदस्य नहीं होते हैं, और कोई उपयोगकर्ता-निर्धारित प्रतिलिपि असाइनमेंट ऑपरेटर और नहीं है उपयोगकर्ता-परिभाषित विध्वंसक।

एक POD वर्ग होने के नाते टेल पैडिंग पुन : उपयोग को अक्षम करता है :

इन प्रकारों के dsize, nvsize और nvalign को उनके साधारण आकार और संरेखण के रूप में परिभाषित किया गया है। ये गुण केवल गैर-खाली वर्ग प्रकारों के लिए मायने रखते हैं जो बेस कक्षाओं के रूप में उपयोग किए जाते हैं। हम PODs के लिए टेल पैडिंग को नजरअंदाज करते हैं क्योंकि मानक के शुरुआती संस्करण ने हमें इसे किसी और चीज के लिए उपयोग करने की अनुमति नहीं दी थी और क्योंकि यह कभी-कभी टाइप की तेजी से नकल करने की अनुमति देता है।

इस प्रकार, आपके पहले उदाहरण में, Aलेआउट उद्देश्यों के लिए POD नहीं है और इसके टेल पैडिंग का उपयोग किया जा सकता है B::c, लेकिन आपके दूसरे उदाहरण में, यह एक POD है, और इसकी टेल पैडिंग का पुन: उपयोग नहीं किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.