एक वर्ग बनाम संरचना का उपयोग करते समय क्या ओवरहेड्स और अन्य विचार हैं?


17

एम्बेडेड सिस्टम पर C ने संरचित डेटा को धारण करने के लिए पारंपरिक रूप से संरचनाओं का उपयोग किया है।

Arduino तालिका में C ++ लाता है, इसलिए हम इसके बजाय कक्षाओं का उपयोग कर सकते हैं।

कहते हैं कि हमारे पास दो अलग-अलग डेटा संरचनाएं हैं जिन्हें बहुत समान माना जा सकता है:

typedef struct 
{
    int valueOne;
    int valueTwo;
    int valueThree;
} value_t;

तथा:

class Value
{
    public:
        int valueOne;
        int valueTwo;
        int valueThree;
}

स्मृति के संदर्भ में, इससे क्या फर्क पड़ेगा?

मुझे अभी भी संरचना तकनीक का भारी उपयोग होता दिखाई दे रहा है - यह क्यों है?


5
अगर मुझे अपना C ++ याद है तो डिफ़ॉल्ट दृश्यता के अलावा structऔर classइसके अलावा कोई अंतर नहीं है
शाफ़्ट फ्रीक

4
मुझे लगता है कि structमुख्य रूप से उपयोग किया जाता है क्योंकि एम्बेडेड हार्डवेयर का बड़ा हिस्सा सी में कोडित होता है, इसलिए जो कोई भी छोटे MCUs के लिए बहुत समय कोड लिखने में खर्च करता है, वह शायद C ++ को बेहतर जानता है, और C ++ मुहावरों से पहले C मुहावरों के लिए स्वचालित रूप से पहुंच जाता है। यह एक प्रोग्रामर के प्रदर्शन का मुद्दा है।
कॉनर वुल्फ

जवाबों:


13

जब आपको C ++ में एक संरचना बनाम एक वर्ग का उपयोग करना चाहिए, तो स्वीकृत उत्तर से लिया गया

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

मैं किसी भी वर्ग जैसी सुविधाओं के बिना सादे-पुराने डेटा संरचनाओं के रूप में और निजी डेटा और सदस्य कार्यों के साथ कुल डेटा संरचनाओं के रूप में कक्षाओं का उपयोग करने के लिए संरचनाओं का उपयोग करने की सलाह दूंगा।

मेमोरी वार एक्सेस मॉडिफायर से कोई फर्क नहीं पड़ता है और Arduino की मेमोरी बाधाओं को देखते हुए, लोगों को जटिल पदानुक्रमों के साथ कक्षाओं का उपयोग करने की संभावना कम है, लेकिन वैसे भी POD संरचनाएं पसंद करते हैं।


7

C के विपरीत, structC ++ में एक उदाहरण एक वस्तु है जो ठीक उसी तरह से है जैसे किसी इंस्टेंस का उदाहरण class। संकलित कोड के दृष्टिकोण से, वे समान हैं। मेमोरी का उपयोग, अलाइनमेंट, एक्सेस टाइम आदि बिल्कुल एक जैसे हैं (यानी ओवरहेड्स नहीं हैं)।

प्रोग्रामर के दृष्टिकोण से, बहुत मामूली अंतर है। एक के सदस्य struct, डिफ़ॉल्ट रूप से सार्वजनिक दृश्यता है, जबकि एक के सदस्यों classडिफ़ॉल्ट रूप से निजी होते हैं। अन्यथा, सभी भाषा सुविधाएँ दोनों पर समान काम करती हैं, जैसे कि कंस्ट्रक्टर / डिस्ट्रॉक्टर, इनहेरिटेंस, पॉलीमोर्फिज़्म, टेम्प्लेट, और ऑपरेटर ओवरलोडिंग। तुम भी एक structसे प्राप्त कर सकते हैं class, और इसके विपरीत।

समानता के बावजूद, यह structबहुत ही सरल संरचनाओं के लिए जानबूझकर C ++ में लोगों का उपयोग करने के लिए काफी आम है , उदाहरण के लिए, जहां यह केवल कुछ डेटा सदस्यों के होते हैं, लेकिन कोई कार्य नहीं करता है। A classका उपयोग किसी भी अधिक जटिल चीज़ के लिए किया जाएगा। हालांकि यह पूरी तरह से सम्मेलन या व्यक्तिगत पसंद का मामला है, और इसका उपयोग संरचना की इच्छित जटिलता के सूक्ष्म संकेत के रूप में किया जा सकता है।


4

जैसा कि अन्य उत्तरों ने बताया है, आपके विशेष structऔर classअप्रभेद्य प्रदर्शन बुद्धिमान हैं (प्रकार के नामों के स्कोप में थोड़े अंतर हैं, जिस तरह से आपने अपनी संरचना को परिभाषित किया है)। सी ++ में परिसीमन बीच नहीं है structऔर class, लेकिन उन प्रकारों के बीच है जो पीओडी (सादे पुराने डेटा) और प्रकार हैं जो इस चर्चा में नहीं बताए गए हैं ।


3

स्मृति के संदर्भ में, इससे क्या फर्क पड़ेगा?

कोई नहीं। संरचनाएं और कक्षाएं एक ही चीज हैं, केवल सुरक्षा स्तरों में भिन्न होती हैं, और तुरंत या तो एक 'ऑब्जेक्ट' बनाता है।

अभी भी देखते हैं कि संरचना तकनीक का भारी उपयोग किया जा रहा है - यह क्यों है?

यदि आप डेटा सदस्यों को छिपाने का प्रयास नहीं कर रहे हैं तो कम टाइपिंग।


2

ध्यान दें कि

typedef struct { ... } Foo;

C ++ में अप्रचलित है और आपको बस उपयोग करना चाहिए

struct Foo { ... };

यह उत्तर में बहुत स्पष्ट नहीं है, लेकिन कक्षाओं के साथ डिफ़ॉल्ट रूप से डिफ़ॉल्ट बनाम निजी वंशानुक्रम द्वारा संरचनाओं का अन्य प्रभाव सार्वजनिक विरासत है।

जैसा कि दूसरों ने उल्लेख किया है, संरचना का उपयोग आमतौर पर पीओडी प्रकारों के लिए एक सम्मेलन है।

साथ ही तकनीकी रूप से class स्ट्रक्चर बनाम ऑब्जेक्ट ’को ically स्ट्रक्चर बनाम क्लास’ होना चाहिए (जैसा कि किसी स्ट्रक्चर को इंस्टेंट करना या क्लास अभी भी ऑब्जेक्ट देता है)।


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