C C +, और C ++ ओवर C का उपयोग कब करें?


164

मुझे अब एक वर्ष से थोड़ा अधिक समय के लिए कंप्यूटर विज्ञान में पेश किया गया है, और मेरे अनुभव से ऐसा लगता है कि सी और सी ++ दोनों को "अल्ट्राफास्ट" भाषा माना जाता है, जबकि अन्य जैसे पायथन और इस तरह की स्क्रिप्टिंग भाषाओं को आमतौर पर कुछ धीमा माना जाता है ।

लेकिन मैंने कई मामलों को भी देखा है जहां एक सॉफ्टवेयर प्रोजेक्ट या यहां तक ​​कि एक छोटी सी फाइल को इंटरलेव करेगा जहां उन फाइलों की एक निश्चित संख्या n सी में लिखी जाएगी, और उन फाइलों की एक निश्चित संख्या मी सी ++ में लिखी जाएगी।

(मैंने यह भी देखा कि C ++ फ़ाइलों में लगभग हमेशा हेडर होते हैं, जबकि C फाइलें बहुत अधिक नहीं होती हैं)। लेकिन मेरी जांच का मुख्य बिंदु यह है कि जब C C C ++ से अधिक का उपयोग करना उचित हो, और जब C से अधिक C ++ का उपयोग करना बेहतर हो, तो इस तथ्य का सामान्य अर्थ प्राप्त करना होगा कि तथ्यों के अलावा (1) C ++ वस्तु-उन्मुख है जबकि सी नहीं है, और (2) सिंटैक्स बहुत समान हैं, और सी ++ जानबूझकर कई तरीकों से सी जैसा बना था, मुझे यकीन नहीं है कि उनके अंतर क्या हैं। यह मुझे लगता है कि वे (लगभग) कई डोमेन में पूरी तरह से विनिमेय हैं।

तो यह सराहना की जाएगी अगर कोई स्थिति को साफ कर सकता है! धन्यवाद


4
C ++ कोड में C इनलाइन का उपयोग करना आमतौर पर कुछ ऐसे मॉड्यूल के लिए होता है, जिन्हें अत्यधिक अनुकूलित करने की आवश्यकता होती है, जो हार्डवेयर के बहुत कम स्तर के काम करते हैं, या डेटा की अखंडता या यहां तक ​​कि मानव सुरक्षा के लिए महत्वपूर्ण होते हैं और श्रवण और सही साबित होने की आवश्यकता होती है। सी में यह सब करने के बजाय, परियोजना के थोक लचीले डिजाइनों के लिए सी ++ सुविधाओं का लाभ ले सकते हैं, जबकि उन जगहों पर सी की जकड़न का लाभ प्राप्त कर सकते हैं जहां इसकी आवश्यकता है।
काइलबेन

30
@kylben: कई सी ++ लोग आपको बताएंगे: (1) प्रदर्शन सी के लिए ड्रॉप करने का कारण नहीं है (शायद बचने के लिए virtualऔर कुछ अन्य विशेषताएं जो अनुकूलन को रोकती हैं, लेकिन उदाहरण के लिए गैर- virtualकक्षाएं स्वाभाविक रूप से अक्षम नहीं हैं, और टेम्पलेट ए हैं शक्तिशाली अमूर्त उपकरण जो वास्तव में अधिक कुशल पैदा कर सकता है - जैसे qsortबनाम std::sort)। (2) शुद्धता का अत्यधिक महत्व C ++ (टाइपफेसिटी, constनेस, privateRAII का उपयोग करने के लिए संसाधन प्रबंधन प्रबंधनीय, आदि) का उपयोग करने के लिए एक कारण है । C. या उस मामले के लिए, पहली जगह में Ada या कुछ का उपयोग करें।

11
@ Pubby8 मैं इससे असहमत हूं। अगर मैं एक .c फ़ाइल पर काम कर रहा हूं और मुझे लगता है कि लोग ऐसा करते हैं, तो मैं मानसिक रूप से उन्हें ध्वजांकित करता हूं कि वे नहीं जानते कि वे क्या कर रहे हैं। उदाहरण के लिए, void*सी कोड में किसी अन्य पॉइंटर प्रकार से कास्ट करने की कोई आवश्यकता नहीं है , यह बहुत ही विचलित करने वाले और विशिष्ट लोग हैं जो सी को नहीं जानते हैं
asveikau

4
@kylben: (आप अपनी टिप्पणी के जवाब में दूसरों को ठीक से जानना चाह सकते हैं, इसलिए उनके पास वास्तव में उन्हें देखने का मौका है ।) कि "एक प्रोग्रामर बहुत परिचित है कि कंपाइलर सी को कैसे बदलता है" सी ++ के लिए काम करेगा। कुंआ। लेकिन यह बिलकुल ही अप्रासंगिक है: यदि आप असम में डब करना चाहते हैं, तो बस संकलक लिखने के बजाय इसे किसी अन्य भाषा से बनाएं। जिस तरह से ऐसा होता है वह हर कंपाइलर अपडेट के बाद बदल सकता है।
sbi

9
मेरी विनम्र राय में ... आप C का उपयोग तब करते हैं जब आप मेरे लिए चाहते हैं: C ++ की तुलना में C अधिक सरल और उपयोग करने में आसान है ... C ++ एक "C वर्गों के साथ" की तरह लग सकता है, लेकिन यह अब नहीं है, अब यह है वर्चुअल कंस्ट्रक्टर और टेम्प्लेट जैसी चीजों के साथ एक बहुत ही जटिल भाषा।
दिसोको

जवाबों:


184

जब आप सी चुनें

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

अन्य सभी मामलों में आपको C ++ चुनना चाहिए।


15
मैं यह भी कहूंगा कि C ++ अपवाद मॉडल के साथ कभी-कभी इसके लायक होने की तुलना में अधिक परेशानी लाता है, ओएस केर्नल्स के लिए। सामान के बारे में पढ़ते समय कम से कम यह सामान्य एहसास है जिसे मैंने प्राप्त किया है।
कोडर

12
@ एसएफ: सी लिंगुआ फ्रेंका है? यह नया है। या बल्कि, बहुत पुराना है। हो सकता है कि यदि आप केवल उन लोगों के साथ बातचीत करते हैं जिन्होंने पिछले 20 वर्षों से नई भाषाएँ नहीं सीखी हैं, लेकिन मैं कहूँगा कि C ज्ञान अब बहुत सामान्य नहीं है।
डेडएमजी

13
@ एसएफ: जैसा कि मैंने कहीं और लिखा है, मैं उन परियोजनाओं में रहा हूं, जिनमें लाखों एलओसी की राशि थी , और सी परियोजनाओं की तुलना में उनकी अपरिहार्य और सर्वव्यापी मैक्रो हैकरी की तुलना में बहुत कम मेटा-सामान देखा। (OTOH, जरूरत पड़ने पर EDSLs बनाने की क्षमता आपके बॉक्स में एक अविश्वसनीय रूप से शक्तिशाली उपकरण हो सकता है।) C के लिए लिंगुआ फ्रैंका: जैसा कि मैं अपने कार्यकाल के लिए छड़ी चाहता हूं कि यह सबसे कम आम भाजक है। और मैं मध्यम प्रोग्रामिंग कौशल वाले लोगों को ओएस कर्नेल में हैकिंग नहीं करना चाहता।
sbi

18
@ मोम: मैं पूरी तरह से असहमत हूं। C एक बेकार भाषा है, जब तक कि कुछ असाध्य व्यावहारिक अवरोध C ++ के उपयोग को नहीं रोकता है।
डेडएमजी ऑक्ट

17
@ बट्टन्स: यह आप ही थे जिन्होंने दावा किया था ("C ++ को अधिक मेमोरी की आवश्यकता है"), इसलिए यह आपको होना चाहिए कि कौन बैक अप लेता है। और, नहीं, मैं यह दावा नहीं कर रहा हूं कि C ++ को कम मेमोरी की आवश्यकता है । जो मैं कह रहा हूँ वह यह है कि सुविधाओं लागत, कोई फर्क नहीं पड़ता संकलक उन्हें लागू करता है कि क्या आप (आभासी कार्यों) या आप उन्हें अपने आप को (समारोह संकेत की सरणी) कर लिए।
sbi

88

C. पसंद करने के लिए कुछ कारण हैं। मुख्य एक यह है कि C ++ के साथ सही मायने में छोटे निष्पादन का उत्पादन करना अधिक कठिन है। वास्तव में छोटी प्रणालियों के लिए, आप शायद ही कभी बहुत अधिक कोड लिख रहे हों, और अतिरिक्त ROM स्थान जो C के बजाय C ++ के लिए आवश्यक होगा, महत्वपूर्ण हो सकता है।

हालांकि, मुझे यह भी जोड़ना चाहिए कि वास्तव में छोटे सिस्टमों के लिए, C के पास ठीक उसी कारण से समस्याएं हैं, और विधानसभा भाषा लगभग एकमात्र उचित विकल्प है। सिस्टम साइज़ की वह सीमा जिसके भीतर सी वास्तव में समझ में आता है, वह काफी छोटा है, और लगातार सिकुड़ रहा है (हालांकि मैं मानता हूँ, काफी धीरे-धीरे)।

C का उपयोग करने का एक और समय / कारण उन कार्यों का एक सेट प्रदान करना है जिन्हें आप अनिवार्य रूप से किसी अन्य भाषा से बांध सकते हैं। आप इन फ़ंक्शंस को C ++ में फ़ंक्शंस के रूप में परिभाषित करके लिख सकते हैंextern "C" , लेकिन ऐसा करना उन फ़ंक्शंस को दुनिया के लिए अनिवार्य रूप से सी-लाइफ "फेस" प्रस्तुत करने के लिए प्रतिबंधित करता है - कक्षाएं, अतिभारित फ़ंक्शंस, टेम्प्लेट, और सदस्य फ़ंक्शंस, आदि, की आवश्यकता नहीं है लागू। यह आवश्यक रूप से विकास को सी तक सीमित नहीं करता है - हालांकि, सी + + सुविधाओं के किसी भी और सभी प्रकार के आंतरिक रूप से उपयोग करने के लिए यह पूरी तरह से उचित है , जब तक कि बाहरी इंटरफ़ेस सी की तरह नहीं होता है।

उसी समय, मुझे कहना होगा कि @ टोल के उत्तर (एक स्पष्ट उदाहरण के लिए) में ज्यादातर मामलों में पीछे की ओर चीजें हैं। यथोचित लिखा सी ++ आमतौर पर कम से कम सी के रूप में तेजी से होगा, और अक्सर कम से कम थोड़ा तेज। पठनीयता आम तौर पर बहुत बेहतर होती है, यदि केवल इसलिए कि आप सबसे तुच्छ एल्गोरिदम और डेटा संरचनाओं, सभी त्रुटि हैंडलिंग, आदि के लिए सभी कोड के हिमस्खलन में नहीं दबे रहते हैं।

टेम्प्लेट "भाषा की प्रकार प्रणाली के साथ एक समस्या को ठीक नहीं करते हैं", वे बस बिना किसी टेम्पलेट के सी और / या सी ++ से लगभग पूरी तरह से अनुपस्थित मूलभूत क्षमताओं की संख्या जोड़ते हैं। मूल इरादों में से एक प्रकार-सुरक्षित कंटेनरों के लिए प्रदान करना था, लेकिन वास्तव में वे इससे बहुत आगे जाते हैं - अनिवार्य रूप से कोई भी सी बिल्कुल भी प्रदान नहीं करता है।

स्वचालित उपकरण ज्यादातर लाल हेरिंग के रूप में अच्छी तरह से होते हैं - जबकि यह सच है कि सी पार्सर लिखना सी ++ पार्सर लिखने की तुलना में कम काम है, वास्तविकता यह है कि यह अंत में लगभग कोई फर्क नहीं पड़ता है। बहुत कम लोग किसी एक के लिए प्रयोग करने योग्य पार्सर लिखने के लिए तैयार या सक्षम होते हैं। इस तरह, उचित शुरुआती बिंदु या तो क्लैंग है।

जैसा कि होता है, C और C ++ को समान परियोजनाओं पर एक साथ अक्सर उपयोग किया जाता है, समान लोगों द्वारा बनाए रखा जाता है। यह कुछ ऐसा है जो अन्यथा बहुत दुर्लभ है: एक ऐसा अध्ययन जो सीधे तौर पर दो भाषाओं में लिखे गए कोड की स्थिरता की तुलना उन लोगों द्वारा करता है जो समान रूप से सक्षम हैं (यानी, बिल्कुल समान लोग)। कम से कम जुड़े हुए अध्ययन में, एक निष्कर्ष स्पष्ट और अस्पष्ट था: "हमने पाया कि सॉफ्टवेयर की गुणवत्ता में सुधार के परिणामस्वरूप C ++ के बजाय C ++ का उपयोग करना और रखरखाव के प्रयास को कम करना ..."


12
उपकरण समर्थन एक लाल हेरिंग नहीं है। दी, आजकल हम झगड़ रहे हैं। लेकिन सी ++ के लिए उपकरण समर्थन करता है बड़ा शॉट IDEs में भी ओडर भाषाओं में काफी पीछे अंतराल,। ऐसा क्यों है? सरल, क्योंकि बहुत हाल तक कोई क्लैंग नहीं था (और जीसीसी कभी भी एक विकल्प नहीं था)। आधा साल पहले तक, अगर आपको C ++ कोड की एएसटी की आवश्यकता थी, तो आप मूल रूप से भाग्य से बाहर थे या हजारों डॉलर से बाहर थे (यदि आपने ईडीजी का मोर्चा खरीदा है)।
कोनराड रूडोल्फ

5
+1, और रिकॉर्ड के लिए, मैं नियमित रूप से 4KiB रोम के साथ 8-बिट प्रोसेसर के लिए C ++ कोड लिखता हूं।
अवकर

2
एक समग्र महान जवाब के लिए +1। जो मुझे समझ नहीं रहा है (मुझे कोई अनुभव नहीं है। यह है) क्यों (मुझे लगता है कि हम एम्बेडेड बात कर रहे हैं?) एक सी संकलक को एक C ++ संकलक की तुलना में छोटे निष्पादन योग्य कोड का उत्पादन करना चाहिए जो उसी सुविधा सेट का उपयोग करता है ? शायद आप कुछ संदर्भ प्रदान कर सकते हैं?
मार्टिन बा

2
@ मर्टिन: मुख्य बात यह है कि सी ++ में अपवाद हैंडलिंग शामिल है, जो (कम से कम आमतौर पर) निष्पादन योग्य आकार में कुछ न्यूनतम जोड़ता है। अधिकांश संकलक आपको अपवाद हैंडलिंग को अक्षम करने देंगे, लेकिन जब आप परिणाम करते हैं तो वह अब C ++ नहीं है। मुझे संदेह है कि सरल तथ्य से थोड़ा सा भी है कि कई सी ++ संकलक विक्रेता अभी तक सबसे छोटे संभव आउटपुट कोड का उत्पादन करने में बहुत मुश्किल काम नहीं करते हैं।
जेरी कॉफिन

3
"हमने पाया कि C ++ के बजाय C का उपयोग करके सॉफ्टवेयर की गुणवत्ता में सुधार और रखरखाव के प्रयास में कमी आई है ..." यह याद रखने का निष्कर्ष है।
स्टीफन रोलैंड

24

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

(साइड-नोट: लिनुस टॉरवाड्स शेयर्स की जांच करें कि वह C से C ++ को क्यों पसंद करता है। मैं जरूरी नहीं कि उसकी बातों से सहमत हो, लेकिन यह आपको इस बात की जानकारी देता है कि लोग C ++ से अधिक क्यों चुन सकते हैं। बल्कि, लोग जो उससे सहमत हैं। इन कारणों के लिए C चुन सकते हैं।)


51
-1लिनुस के शेख़ी के लिए। : - {
sbi

12
उस के लिए मुझे एक शून्य मत करो! Haha। मैं लिनुस से सहमत नहीं हूं, लेकिन यह बहुत अच्छा उदाहरण है कि लोग सी + + (अगर वे मानते हैं कि लिनुस का मानना ​​है) पर सी का चयन कर सकते हैं। मैं उन कारणों की वैधता पर टिप्पणी नहीं कर रहा हूं।
केसी पैटन

10
@ कैसीपट्टन: मूल रूप से, मैं हर उस उत्तर को दरकिनार कर देता हूं जो इस बयानबाजी को इस तरह से प्रस्तुत करता है जैसे कि यह एक वास्तविक तर्क हो।
sbi

11
@ कोडर: आपको एसटीएल कार्यान्वयन का ज्ञान नहीं है। एसटीएल का बहुत महत्वपूर्ण बिंदु यह है कि आपको कार्यान्वयन को जानना नहीं है, जब तक आप मानक द्वारा परिभाषित व्यवहार पर निर्भर नहीं होते हैं- इस स्थिति में, मानक पुस्तकालय का उपयोग करने में परेशान क्यों होते हैं? इसके अलावा, यह एक टेड पागल की तुलना में अधिक है क्योंकि यह डेवलपर्स कैसे व्यवहार करता है, इसकी भाषा पसंद नहीं है। C प्रोग्रामर ऐसे व्यवहार करते हैं जैसे C मनुष्य को ईश्वर का उपहार है और यह स्पष्ट सत्य को देखने के लिए बहुत अंधे हैं कि C ++ ऐसी सुविधाएँ प्रदान करता है जो मूल रूप से और आंतरिक रूप से सीधे C से बेहतर हैं, जैसे RAII।
डेडएमजीन

8
@ कोडर: यदि आप एक ही ऑब्जेक्ट पर इतने सारे शेयर्ड_एप्टर्स के साथ समाप्त होते हैं कि आप आंतरिक काउंटर को ओवरफ्लो करते हैं, तो आप इसे गलत कर रहे हैं। मानक काउंटर के लिए एक न्यूनतम आकार निर्दिष्ट करेगा- शायद 32 बिट- और यह एक एकल वस्तु के लिए 2 बिलियन से अधिक साझा किए जाने के लिए बहुत अवास्तविक है। यहां तक ​​कि अगर ऑब्जेक्ट में 0 आकार था, और आपके पास एक शून्य-ओवरहेड मेमोरी एलोकेटर था, तो आप अभी भी 16 जीबी मेमोरी का उपभोग कर रहे हैं, बस साझा किया गया।
डेडएमजीन

13

मौजूदा उत्तरों में से मुख्य समस्या गायब है (इस पोस्टिंग के समय के अनुसार)।

यह आसान है। यदि, कुछ तर्कहीन कारण से, आपको लगता है कि अपवाद ओवरहेड के लायक नहीं हैं, तो आपको उनका उपयोग करने की आवश्यकता नहीं है । आपके पास अभी भी टेम्पलेट और RAII और मानक पुस्तकालय हो सकते हैं, और कभी भी "फेंक" न लिखें। वही टेम्प्लेट के लिए जाता है। यदि, किसी कारण से, आपको लगता है कि वे अपरिवर्तनीय हैं (और वास्तव में महत्वपूर्ण है, जो यह केवल एम्बेडेड पर है) निष्पादन योग्य ब्लोट, तो आश्चर्य करें - आप पूरे दिन भी शून्य * और आकार (टी) का उपयोग कर सकते हैं। C के ऊपर C ++ की किसी भी सुविधा का उपयोग करने के लिए आपको कुछ भी बाध्य नहीं करता है।

यही कारण है कि C ++ एक स्वाभाविक रूप से बेहतर भाषा है- आप अपनी इच्छित सुविधाओं को चुन सकते हैं, और जब आप किसी दिए गए फ़ीचर को नापसंद करते हैं, तो C-स्टाइल प्रोग्रामिंग में वापस आ सकते हैं। इसलिए, यह देखते हुए कि C ++ सब कुछ है C और अधिक है, यह एक स्पष्ट तथ्य है कि C ++ एक बेहतर भाषा है। अन्यथा सुझाव देना यह सुझाव देने की कोशिश करने जैसा है कि 4 5 से अधिक है।


1
आपके तर्क के बाद मूल प्रश्न का कोई मतलब नहीं है और इसलिए इसे बंद कर दिया जाना चाहिए। मुझे लगता है कि प्रश्न को कुछ इस तरह से पढ़ा जाना चाहिए: जब हमें सी ++ के सी सबसेट में खुद को प्रतिबंधित करना चाहिए (सादे सी का उपयोग करें) और कब यह पूर्ण सी ++ का उपयोग करने के लिए समझ में आता है।
जियोर्जियो

यह सच है, लेकिन केवल एक व्यक्ति के अपने छोटे प्रोजेक्ट पर काम करने के मामलों के लिए। वास्तविक जीवन में लगभग हर व्यक्ति अपना आधा समय अन्य लोगों के कोड पर काम करने में खर्च करता है। दुर्भाग्य से अधिकांश अन्य लोग "गलत सोचते हैं" जो पूरी तरह से तर्कहीन कारणों से संबंधित हैं।
डेरेनडब्ल्यू

1
@DeadMG: अपवादों को फेंके बिना त्रुटियों को रिपोर्ट करने के लिए आवंटनकर्ता कैसे हैं? इसके अलावा, अधिक सुविधाओं को जोड़ना जरूरी नहीं है, जब यह सब कुछ जटिलता या अतिरेक जोड़ रहा है।
मकरध्वज

@Mankarse: यदि आप अपवादों को अक्षम करने के विकल्पों के साथ संकलित करते हैं, तो आवंटनकर्ता प्रोग्राम को निरस्त कर देते हैं या लाइब्रेरी के कार्यान्वयन के आधार पर एक शून्य सूचक का उपयोग करने के लिए आगे बढ़ते हैं।
ज़ैन लिंक्स

4
@ मानकार् य: 2007 में मेरे अनुभव के बाद से जब मैंने 1 जीबी रैम और कोई स्वैप के साथ लिनक्स सिस्टम चलाने की कोशिश की थी, लगभग सभी डेस्कटॉप सॉफ़्टवेयर भयानक भयानक तरीके से विफल हो जाते हैं जब मेमोरी आवंटन किसी भी तरह से विफल हो जाता है।
ज़ैन लिंक्स

9

C ++ की बातें जो C प्रोग्रामर को परेशान करती हैं

हुड के नीचे बहुत सारा जादू हो रहा है; कंस्ट्रक्टर, डिस्ट्रक्टर्स, वर्चुअल मेथड्स, टेम्प्लेट आदि, C ++ कोड को C कोड के मुकाबले लिखने में बहुत आसान और तेज़ बना सकते हैं, लेकिन समझने में कठिन और कारण के माध्यम से समझ सकते हैं (आप कितनी अच्छी तरह से C ++ और उससे जुड़े सम्मेलनों को जानते हैं)। कुछ के रूप में सरल के रूप में कोड का Foo newFoo;एक बहुत आह्वान कर सकते हैं , इस पर निर्भर करता है कि वर्ग के लिए निर्माता Foo(और किसी भी वर्ग पर निर्भर करता है) को कैसे परिभाषित किया गया है। यह इसलिए भी है कि सम्मेलन को कंटेनर के माध्यम से पुनरावृत्ति ++itकरने के बजाय लिखना है it++, क्योंकि पोस्टफ़िक्स में ++अक्सर एक महंगी कॉपी ऑपरेशन शामिल होता है।

आप जो कर रहे हैं, उसके आधार पर , विशेष रूप से सरल कार्यों के लिए कुछ गैर-तुच्छ ओवरहेड हो सकते हैं। निम्नलिखित दो प्रोग्राम लें, C में पहला, C ++ में दूसरा:

/* C version */
#include <stdio.h>
int main(void)
{
  char greeting[] = "Hello, world";
  printf("%s\n", greeting);
  return 0;
}
/* end C version */

/* C++ version */
#include <iostream>
#include <string>
int main(void)
{
  std::string greeting("Hello, world");
  std::cout << greeting << std::endl;
  return 0;
}
/* end C++ version */

पहचान का व्यवहार, स्रोत के संदर्भ में बहुत अधिक अंतर नहीं है, लेकिन SLES 10 बॉक्स पर मैं gcc 4.1.2 के साथ काम करता हूं, पूर्व आकार में ~ 9kb का निष्पादन योग्य बनाता है, जबकि दूसरा 12.5kb (कोई अनुकूलन नहीं) लेता है ), लगभग 28% बड़ा। stringC स्ट्रिंग प्रकार की तुलना में C ++ टाइप IMO के साथ काम करने के लिए बहुत आसान है, और C ++ स्ट्रीम C स्ट्रीम की तुलना में बहुत अधिक लचीले और अनुकूलन योग्य हैं, लेकिन वास्तव में इस तरह के ब्रेन-डेड कोड के लिए, वे ओवरहेड के लायक नहीं हो सकते हैं।

C ++ , C की तुलना में एक बहुत बड़ी भाषा है, जिसमें कुछ बेहद जटिल शब्दार्थ हैं। C ++ की तुलना में C ++ में पारंगत होने में बहुत अधिक समय लगता है, जिसका अर्थ है कि बहुत से लोग जो C ++ को जानने का दावा करते हैं, वे यह नहीं जानते कि वे ऐसा करते हैं।

C के बारे में चीजें जो C ++ प्रोग्रामर को परेशान करती हैं

सी कल्पना के किसी भी खंड द्वारा एक सुरक्षित प्रोग्रामिंग भाषा नहीं है; सरणियों पर कोई सीमा नहीं जाँच करने से बहुत अधिक व्यवहार होता है (जैसा कि यह अब-मृत getsफ़ंक्शन के माध्यम से scanfहोता है, %sऔर %[रूपांतरण रूपांतरण के माध्यम से होता है )। C ++ कम से कम आपको ऐसे कंटेनर देता है जो अपवादों को फेंकते हैं यदि आप उनकी वर्तमान में परिभाषित सीमा के बाहर तक पहुँचने का प्रयास करते हैं; सभी सी आपको देता है (यदि आप भाग्यशाली हैं) एक विभाजन उल्लंघन।

C ++ में मेमोरी प्रबंधन बहुत ही श्रम-गहन और त्रुटि प्रवण है, टूल C ++ आपको प्रदान करता है। यदि आप अपना कंटेनर बना रहे हैं, तो आप सभी कॉल mallocऔर freeकॉल के मिलान के लिए ज़िम्मेदार हैं, सुनिश्चित करें कि आवंटन सफल हैं, त्रुटि की स्थिति में किसी भी आंशिक आवंटन का समर्थन करते हुए, C ++ में, आप केवल आइटम जोड़ते हैं या कंटेनर से आइटम निकालें। यदि कोई समस्या है, तो एक अपवाद फेंक दिया जाएगा।

इसी तरह, सी में त्रुटि से निपटने के उपकरण की तुलना में गधे में एक दर्द है सी + + प्रदान करता है (अर्थात्, अपवाद)। क्या सच में मज़ा है जब आपने स्मृति का एक गुच्छा आवंटित किया है और फिर अपने प्रसंस्करण में एक दीवार मारा; जैसा कि आपको वापस जाना है, आपको उस मेमोरी को सही क्रम में जारी करना होगा। C ++ और RAII सिद्धांतों के साथ, यह (अपेक्षाकृत) करना आसान है।

तो मैं कब एक का उपयोग करता हूं?

यदि आप जो लिख रहे हैं वह एक सरल है, तो इसे पढ़ें / इसे से टकराएं / इससे छुटकारा पाएं, जिसका व्यवहार इनपुट और आउटपुट के संदर्भ में साफ-साफ वर्णित किया जा सकता है, और प्रदर्शन मामले, तो C ++ पर C को प्राथमिकता दें। अन्यथा, C ++ को प्राथमिकता दें


2
मेमोरी प्रबंधन कुछ मामलों में जटिल और त्रुटि प्रवण है, लेकिन विशेष रूप से एम्बेडेड दुनिया में यह अक्सर पूरी तरह से स्थिर मेमोरी आवंटन का उपयोग करके सी प्रोग्राम लिखने के लिए व्यावहारिक है। यदि प्रोग्राम लिंक करता है, तो यह रनटाइम पर मेमोरी से बाहर नहीं निकल सकता है। क्या सी ++ में ऐसी गारंटी आसानी से हासिल की जा सकती है?
सुपरकैट

9

बज़्ने स्ट्रॉस्ट्रुप उन अनुप्रयोगों और कंपनियों की सूची रखता है जो C ++ का उपयोग करते हैं; आप सभी चाहते हैं प्रक्रियात्मक बनाम OOP प्रोग्रामिंग के बारे में बहस कर सकते हैं, लेकिन आप पिछले 20 वर्षों में उद्योग के परिणामों के साथ बहस नहीं कर सकते।

C ++ आमतौर पर बड़े पैमाने पर, बहु-आदमी, जटिल परियोजनाओं के लिए उपयोग किया जाता है जहां अलग-अलग लोगों को मॉड्यूलर घटकों पर काम करने की आवश्यकता होती है। आप C में निश्चित रूप से मॉड्यूलर कोड बना सकते हैं और बनाए रख सकते हैं, लेकिन C ++ की अंतर्निहित OOP प्रकृति बेहतर मॉड्युलराइजेशन, टेस्टिबिलिटी और कोड-पुनः उपयोग की ओर ले जाती है।

C ++ मानक पुस्तकालय (STL), अपने आप में केवल वैक्टर और मानचित्रों के साथ, C ++ का उपयोग करने के लिए पर्याप्त है।

सी आमतौर पर एम्बेडेड सिस्टम के लिए उपयोग किया जाता है।

मैं व्यक्तिगत रूप से C का उपयोग केवल तभी करूँगा जब कुछ लाइब्रेरी है जिसमें केवल C API है।


19
आपका अंतिम वाक्य C का उपयोग करने का कोई कारण नहीं है। आप C ++ से C पुस्तकालयों को कॉल कर सकते हैं।
user207421

2
मैंने एक डीएसपी प्रोजेक्ट के लिए c ++ का उपयोग किया - c
BЈовић

9

मैं कहूंगा कि मैं C ++ में C का चयन करने का मुख्य कारण केवल तभी होगा जब मुझे "NASA से 1000% स्थिर" NASA तरह के सामान का सहारा लेना होगा।

जब हम प्रदर्शन को देखते हैं तो C ++ ~ 99% C होता है, और यह बहुत अधिक उत्पादक होता है। तो C में रहते हुए भी आप C ++ की तुलना में अधिक तेज़ कोड लिख सकते हैं (आप अपवादों के बिना C ++ के सबसेट का उपयोग कर सकते हैं, आभासी, स्ट्रीमिंग, अमूर्त आदि, लेकिन यह मूल रूप से C है), हर लानत चीज़ को अनुकूलित करने का समय जब एसटीएल का परीक्षण किया जाता है और वह पहले से ही करता है, तो आपको प्राप्त होने वाले छोटे प्रदर्शन लाभ की तुलना में अधिक लागत आएगी, या बलिदान करना होगा क्योंकि एसटीएल एल्गोरिदम विशेषज्ञों के समूहों द्वारा लिखे गए हैं, और आप शायद हर चीज में विशेषज्ञ नहीं हैं।

दूसरी ओर C ++ में एक टन का अमूर्त है। जब किसी परिस्थिति में वे लीक होते हैं, तो यह आपको मुश्किल में डाल देता है। और कुछ लोग ऐसे हैं जिन्हें C ++ गोचर्स का 100% पता है, जबकि, मुझे लगता है, सभी C गोचरों के बारे में अधिक जानकारी है, इसलिए एक समाधान लिखना जहां हर चरण पूरी तरह से एक टीम के सभी सदस्यों द्वारा समझा जाता है, सी में बहुत आसान है।

उदाहरण: क्या आप जानते हैं कि shared_ptr<smthn>इसकी संदर्भ गणना कब समाप्त होगी, क्या यह एक अपवाद फेंक देगा? जब शीतल को वायुमंडल का पुनर्मिलन करना पड़ता है तो ऐसी चीजें शांत नहीं होती हैं, कम से कम मुझे ऐसा लगता है।

साथ ही, त्रुटि कोड की तुलना में अपवाद हैंडलिंग बहुत कठिन है। यह देखना मुश्किल है कि कक्षा 100% अपवाद सुरक्षित है, और लीक में आना आसान है। बहुत से उच्च प्रतिनिधि लोगों ने यह राय व्यक्त की है।


12
और जिस तरह से सी + + 'अमूर्त की तरह मेमोरी को "अधिक स्थिर" मैन्युअल रूप से प्रबंधित std::stringकिया जा रहा है? क्या आपने कभी एक प्लेटफॉर्म निर्दिष्ट करने की कोशिश की है जहां shared_ptrकाउंटर ओवरफ्लो होगा? यह एक अजीब मंच की एक बिल्ली होगी। और अगर आपको लगता है कि अपवाद संभालना कठिन है, तो आपको सी कोड के एक टुकड़े पर एक नज़र डालनी चाहिए जो हर फ़ंक्शन कॉल पर हर संभव त्रुटि की जांच करता है। (इस तरह के कोड से आना मुश्किल है, मैं मानता हूं, लेकिन यह आपके बयान के खिलाफ एक और भी मजबूत तर्क है।) क्षमा करें, लेकिन यह वास्तव में गोजातीय अपवर्जन है।
sbi

12
@ लुंडिन: '"इसे 1000% स्थिर होना चाहिए" कार्यान्वयन पहले स्थान पर गतिशील मेमोरी आवंटन की अनुमति नहीं देता है।' और क्या आप सी C ++ में वास्तव में ऐसा करने से रहता है ?? (और किसी भी तर्क प्रदान करने के बजाय मेरे ज्ञान और अनुभव के बारे में कंबल बयान करना एक सस्ता बयानबाजी की चाल है।)
sbi

10
@ लुंडिन: अच्छा है कि आपने बयानबाजी के बजाय तर्क देना शुरू कर दिया है। लेकिन वे कमजोर हैं। कि आप C ++ की मुख्य विशेषताओं (टेम्प्लेट) में से एक को "भूल" गए हैं, एक जो कोड को सुरक्षित बनाता है (क्योंकि यह एल्गोरिदम को निष्पादित करने की अनुमति देता है - और इस प्रकार, विफल - संकलन-समय पर , रन-टाइम त्रुटियों को समाप्त करता है), नहीं करता है उस भाषा के अपने ज्ञान के पक्ष में बोलें जिसे आप जज कर रहे हैं। C ++ को OO भाषा में कम करने की यहाँ पहले, और अच्छे कारणों से आलोचना की गई है। (इसके अलावा, निर्धारक विनाश वाली कक्षाएं एक महान उपकरण हैं और केवल स्मृति से अन्य संसाधनों के प्रबंधन के लिए सहायक हैं।)
sbi

9
std::stringयदि आप डायनेमिक एलोकेशन नहीं चाहते हैं तो @Lundin का उपयोग जरूर करें । आप उपयोग करेंगे std::basic_string<char, std::char_traits<char>, some_allocator_here>
ल्यूक डैंटन

10
@ कोडर: आपको क्या लगता है कि आप इनसे क्या साबित करते हैं? पहला एक बुरा कोड है (और रिटर्न मानों के रूप में केवल खराब रिपोर्टिंग त्रुटियों के रूप में होगा), दूसरा मैनुअल सफाई पर RAII के लिए एक मामला बनाता है जिसमें हर आधे-सभ्य सी ++ देवता खुश होंगे, और जोएल, जितना मैं। उसका सम्मान करें, कुछ बातें कही जिनसे मैं पूरी तरह असहमत हूं। सिंगल-एंट्री-सिंगल-एग्जिट गला के लिए उनका प्लग एक अनजाने पुराने गोज़ से बुरी तरह से सहमत है जो कभी भी इस बात से सहमत नहीं होगा कि 25 साल पहले जो उसने सीखा था वह पार हो गया है। (ध्यान रहे, मैं गया था 25 साल पहले, प्रोग्रामिंग जब सेसे कला के राज्य था।)
भारतीय स्टेट बैंक

6

C बेहतर सिंटैक्स के साथ पोर्टेबल असेंबली है, जो प्रोग्रामर को हर चीज का पूरा नियंत्रण देता है ।

दूसरी ओर C ++ बहुत सारे फंकी मैजिक (वर्चुअल फ़ंक्शंस, ओवरलोडिंग, ऑटोमैटिक कन्वर्सेशन, वगैरह वगैरह) करता है, जो तब संभव नहीं होता जब आप यह सुनिश्चित करना चाहते हैं कि आप:

  • जितना आप चाहते हैं उससे अधिक मेमोरी का उपयोग न करें
  • मेमोरी पेजों को विली नीली तक न पहुँचाएँ (व्यवहार्य कहीं भी हो सकता है)
  • गलती से बहुत कोड के लिए आह्वान नहीं

और जब आप प्रदर्शन पर ध्यान केंद्रित कर रहे हैं, तो वास्तव में कुछ सरल काम करना चाहते हैं।

यह सिर्फ कोई आश्चर्य की बात नहीं है, और यह बहुत मूल्यवान है।

यदि आप चाहते हैं (और मैं इसे सुझाता हूं), तो सैन्य उड्डयन नियंत्रण के लिए C ++ लिखते समय आपको क्या सोचने की आवश्यकता है , इस पर JSF कोडिंग दिशानिर्देश पढ़ें । यह वहां बहुत सारे जाल हैं जिनसे आपको अवगत होने की आवश्यकता है, और यह आपको पकड़ सकते हैं। बज़्ने उस दस्तावेज़ का हिस्सा था, इसलिए वह जानता है कि यह किस बारे में है।

इसके अलावा, C बिजली से टकराए गए स्केल्ड ट्रोल की तरह संकलित करता है। C ++, OTOH, संभवतः उन्हीं लोगों द्वारा प्रायोजित किया गया था जिन्होंने SSD कंपनियों में निवेश किया था। :)

(व्यक्तिगत रूप से, मैं C ++ को पसंद करूंगा, लेकिन मुझे यह पसंद नहीं है ...... या तो? --P)


1
सी पर नियंत्रण की पेशकश नहीं करता है चीजों की एक बहुत हैं। एक uint32_t परिणाम (उत्पाद के 32 बिट्स नीचे) प्राप्त करने के लिए एक uint32_t द्वारा गुणा करने के लिए कुशल पोर्टेबल कोड लिखने का प्रयास करें। यदि कोई int64 बिट्स है, तो किसी को कम से कम एक ऑपरेंड को uint64_tअपरिभाषित व्यवहार को रोकने के लिए डालना चाहिए , लेकिन 32-बिट परिणाम की गणना करने के उद्देश्य से 64 बिट्स के लिए डाली जाना है - इसे हल्के ढंग से रखना - "आश्चर्यजनक"।
सुपरकैट

यह। कंपाइलर आपके लिए रजिस्टर आवंटन जैसी चीजें करता है। मैं CI में असेंबली में मेंटेनेंस कोड नहीं लिख सकता।
Nils

2

(आप दोनों भाषाओं के साथ समान रूप से परिचित हैं)

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

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


1

दोनों भाषाएं उत्कृष्ट हैं। मुझे लगता है कि कई पोस्टरों ने प्रत्येक के लिए ताकत और विभिन्न उपयोगों को विस्तृत किया है। मैं बस इसे जोड़ूंगा:

मैं सी भाषा को 4 क्षेत्रों में परिपूर्ण देखता हूं: 1) मुझे लगता है कि किसी भी प्रकार की प्रोग्रामिंग सीखते समय उपयोग करने के लिए यह सबसे अच्छी भाषा है [कुछ विधानसभा और मशीन कोड के ज्ञान के साथ], 2) यह ड्राइवरों को लिखने के लिए बहुत अच्छा है, 3) एम्बेडेड सॉफ्टवेयर, और 4) सबसे निचले स्तर पर सिस्टम सॉफ्टवेयर।

C ++ एक वस्तु-उन्मुख भाषा है, लेकिन यह प्रक्रियात्मक भी हो सकती है (C के रास्ते में बहुत अधिक)। यदि आप बड़े पैमाने पर परियोजनाओं, GUI- आधारित सॉफ़्टवेयर, गेमिंग सॉफ़्टवेयर, और अन्य प्रकार के ग्राफ़िकल-गहन सॉफ़्टवेयर पर काम कर रहे हैं, तो मुझे C ++, Java, या यहां तक ​​कि Objective-C आपकी सबसे अच्छी पसंद है। हालाँकि, बहुत सारे कमांड-लाइन प्रोग्राम या सिस्टम सॉफ्टवेयर हैं जहाँ आपको C ++ सी से बेहतर या अच्छा लग सकता है।


0

मेरी राय में इस चर्चा में एक बिंदु गायब है: सी में एक पुस्तकालय से एक स्थिर बाइनरी इंटरफ़ेस प्रदान करना सरल है। दोनों अन्य भाषाओं के साथ-साथ C ++ के उपयोग के लिए।

C ++ में अलग-अलग कंपाइलर अलग-अलग नाम की मैनिंग का उपयोग करते हैं, इसलिए लाइब्रेरी से अलग कंपाइलर के साथ संकलित लाइब्रेरी के उपभोक्ता इसे इस्तेमाल करने में समस्या हो सकती है। सी के साथ बाइनरी इंटरफ़ेस, आमतौर पर, प्लेटफ़ॉर्म के लिए मानकीकृत होता है।

मुझे पता है कि आजकल कम्पाइलरों में अक्सर gcc- संगत चीजें बनाने के लिए स्विच होते हैं, लेकिन यह हमेशा मदद नहीं करता है।

मैं अपेक्षाकृत बार सोलारिस पर इसका निरीक्षण करता हूं। वितरण और विभिन्न सॉफ़्टवेयर विक्रेता आमतौर पर सन स्टूडियो का उपयोग करते हैं, विशेष रूप से स्पार्क सिस्टम पर, यह अक्सर बेहतर परिणाम प्रदान करता है। मैन ओपन सोर्स प्रोजेक्ट्स को gcc-specific कोड के साथ लिखा जाता है। साथ काम कर रहे लोगों को पाने के लिए काफी दर्द हो सकता है।


0

C कोड उत्पन्न होने पर C संभवतः C ++ के लिए बेहतर होता है (जैसे उच्च-स्तरीय भाषाओं के कार्यान्वयन में)। उदाहरण के लिए, कई लिस्प-जैसे संकलक हैं जो सी कोड (जैसे चिकन , स्कीम 48 ...) का उत्सर्जन करते हैं, लेकिन मुझे कोई नहीं जानता है जो वास्तविक C ++ कोड का उत्सर्जन करता है (मेरा MELT टूल C ++ कोड का उत्सर्जन करता है, लेकिन मैं उस कोड को वास्तविक नहीं कहूंगा C ++ कोड, यह बहुत कम C ++ सुविधाओं का उपयोग करता है)।

C कोड भी अर्ध स्वचालित रूप से साबित करना आसान है। Frama-C (जहाँ आप अपने C कोड को टिप्पणी के साथ अपने कोड के बारे में कारण जानने में सहायता के लिए एनोटेट करते हैं) जैसे Static analyzers C के लिए उपलब्ध हैं, लेकिन पूर्ण C ++ 11 के लिए इतना नहीं है।

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