मुझे यहाँ कुछ मान्य उत्तर दिखाई देते हैं, लेकिन मैं विस्तार में थोड़ा और विस्तार करने जा रहा हूँ।
यदि आप पाठ की इस पूरी दीवार से नहीं जाना चाहते हैं तो अपने मुख्य प्रश्न के उत्तर के लिए नीचे दिए गए सारांश पर जाएँ।
मतिहीनता
तो, इस मामले में, मैं किसके लिए भुगतान कर रहा हूं?
आप अमूर्तता के लिए भुगतान कर रहे हैं । सरल और अधिक मानवीय अनुकूल कोड लिखने में सक्षम होने के कारण लागत आती है। C ++ में, जो एक वस्तु-उन्मुख भाषा है, लगभग सब कुछ एक वस्तु है। जब आप किसी वस्तु का उपयोग करते हैं, तो तीन मुख्य चीजें हमेशा हुड के नीचे होंगी:
- ऑब्जेक्ट निर्माण, मूल रूप से ऑब्जेक्ट और उसके डेटा के लिए मेमोरी आवंटन।
- ऑब्जेक्ट आरंभीकरण (आमतौर पर किसी
init()
विधि के माध्यम से )। आमतौर पर मेमोरी आवंटन इस कदम में पहली चीज के रूप में हुड के तहत होता है।
- वस्तु विनाश (हमेशा नहीं)।
आप इसे कोड में नहीं देखते हैं, लेकिन हर बार जब आप किसी वस्तु का उपयोग करते हैं, तो उपरोक्त तीनों चीजों को किसी भी तरह से होना चाहिए। यदि आप मैन्युअल रूप से सब कुछ करना चाहते थे, तो कोड स्पष्ट रूप से लंबा होगा।
अब, ओवरहेड को जोड़े बिना एब्सट्रैक्शन को कुशलता से बनाया जा सकता है: एब्स्ट्रैक्शन के ओवरहेड्स को हटाने के लिए कम्पाइलर इनलाइनिंग और अन्य तकनीकों का उपयोग कंपाइलर और प्रोग्रामर दोनों द्वारा किया जा सकता है, लेकिन यह आपका मामला नहीं है।
C ++ में वास्तव में क्या हो रहा है?
यहाँ यह टूट गया है:
std::ios_base
वर्ग आरंभ नहीं हो जाता है, जो सब कुछ मैं / संबंधित हे के लिए आधार वर्ग है।
std::cout
वस्तु आरंभ नहीं हो जाता।
- आपकी स्ट्रिंग को लोड किया गया है और पास किया गया है
std::__ostream_insert
, जो (जैसा कि आप पहले ही नाम से पता लगा चुके हैं) एक विधि है std::cout
(मूल रूप से <<
ऑपरेटर) जो एक स्ट्रिंग को धारा में जोड़ता है।
cout::endl
को भी पास किया गया है std::__ostream_insert
।
__std_dso_handle
को पारित किया जाता है __cxa_atexit
, जो एक वैश्विक कार्य है जो कार्यक्रम से बाहर निकलने से पहले "सफाई" के लिए जिम्मेदार है। __std_dso_handle
स्वयं को इस कार्य द्वारा शेष वैश्विक वस्तुओं को नष्ट करने और नष्ट करने के लिए कहा जाता है।
तो C == का उपयोग करके कुछ भी भुगतान नहीं किया जा रहा है?
C कोड में, बहुत कम चरण हो रहे हैं:
- आपका स्ट्रिंग लोड हो गया है और रजिस्टर के
puts
माध्यम से पारित हो गया है edi
।
puts
कहा जाता है।
कहीं भी कोई वस्तु नहीं, इसलिए किसी भी चीज़ को आरम्भ करने / नष्ट करने की आवश्यकता नहीं है।
हालांकि इसका मतलब यह नहीं है कि आप सी में कुछ भी "भुगतान" नहीं कर रहे हैं । आप अभी भी अमूर्तता के लिए भुगतान कर रहे हैं, और सी मानक लाइब्रेरी और डायनामिक रिज़ॉल्यूशन के printf
फ़ंक्शन (या, वास्तव में puts
, जो संकलक द्वारा अनुकूलित किया गया है, क्योंकि आपको किसी भी प्रारूप स्ट्रिंग की आवश्यकता नहीं है) अभी भी हुड के तहत होता है।
यदि आप इस कार्यक्रम को शुद्ध सभा में लिखते हैं तो यह कुछ इस तरह दिखाई देगा:
jmp start
msg db "Hello world\n"
start:
mov rdi, 1
mov rsi, offset msg
mov rdx, 11
mov rax, 1 ; write
syscall
xor rdi, rdi
mov rax, 60 ; exit
syscall
जो मूल रूप से केवल write
syscall के बाद syscall को लागू करने में परिणत होता है exit
। अब यह न्यूनतम इसी कार्य को पूरा करने के लिए किया जाएगा।
संक्षेप में
सी अधिक नंगे हड्डी है , और केवल नंगे न्यूनतम की आवश्यकता होती है, जो उपयोगकर्ता को पूर्ण नियंत्रण छोड़ती है, जो मूल रूप से वे चाहते हैं कि पूरी तरह से अनुकूलित और अनुकूलित करने में सक्षम हैं। आप प्रोसेसर को एक रजिस्टर में एक स्ट्रिंग लोड करने के लिए कहते हैं और फिर उस स्ट्रिंग का उपयोग करने के लिए एक लाइब्रेरी फ़ंक्शन को कॉल करते हैं। दूसरी ओर C ++ अधिक जटिल और सार है । जटिल कोड लिखते समय इसका बहुत फायदा होता है, और आसानी से लिखने और अधिक मानवीय अनुकूल कोड की अनुमति देता है, लेकिन यह स्पष्ट रूप से एक लागत पर आता है। C ++ में हमेशा प्रदर्शन में एक खामी होने वाली है, अगर C की तुलना इस तरह के मामलों में की जाती है, क्योंकि C ++ ऐसे बुनियादी कार्यों को पूरा करने के लिए जो आवश्यक है उससे अधिक प्रदान करता है, और इस प्रकार यह अधिक ओवरहेड जोड़ता है ।
आपके मुख्य प्रश्न का उत्तर देना :
क्या मैं उसके लिए भुगतान कर रहा हूं जो मैं नहीं खा रहा हूं?
इस विशिष्ट मामले में, हाँ । आप ऐसी किसी भी चीज़ का लाभ नहीं उठा रहे हैं जो C ++ को C से अधिक की पेशकश करनी है, लेकिन ऐसा सिर्फ इसलिए है क्योंकि कोड के उस सरल टुकड़े में कुछ भी नहीं है जो C ++ आपकी मदद कर सकता है: यह इतना सरल है कि आपको वास्तव में C ++ की आवश्यकता नहीं है।
ओह, और बस एक और बात!
सी ++ के फायदे पहली नज़र में स्पष्ट नहीं लग सकते हैं, क्योंकि आपने एक बहुत ही सरल और छोटा कार्यक्रम लिखा है, लेकिन थोड़ा और अधिक जटिल उदाहरण देखें और अंतर देखें (दोनों प्रोग्राम सटीक एक ही काम करते हैं):
सी :
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
int main(void) {
int i, n, *arr;
printf("How many integers do you want to input? ");
scanf("%d", &n);
arr = malloc(sizeof(int) * n);
for (i = 0; i < n; i++) {
printf("Index %d: ", i);
scanf("%d", &arr[i]);
}
qsort(arr, n, sizeof(int), cmp)
puts("Here are your numbers, ordered:");
for (i = 0; i < n; i++)
printf("%d\n", arr[i]);
free(arr);
return 0;
}
C ++ :
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void) {
int n;
cout << "How many integers do you want to input? ";
cin >> n;
vector<int> vec(n);
for (int i = 0; i < vec.size(); i++) {
cout << "Index " << i << ": ";
cin >> vec[i];
}
sort(vec.begin(), vec.end());
cout << "Here are your numbers:" << endl;
for (int item : vec)
cout << item << endl;
return 0;
}
उम्मीद है कि आप स्पष्ट रूप से देख सकते हैं कि मेरा क्या मतलब है। यह भी देखें कि C का उपयोग करके आपको निम्न स्तर पर मेमोरी कैसे प्रबंधित करनी है malloc
और free
आपको अनुक्रमण और आकारों के बारे में अधिक सावधानी बरतने की आवश्यकता है, और इनपुट और प्रिंटिंग लेते समय आपको किस तरह से विशिष्ट होना चाहिए।