अरे हाँ, यह प्रयोग किया जाता है। मैं नेटवर्क पैकेट प्रोसेसिंग के क्षेत्र में काम करता हूं। मैं दो अलग-अलग कंपनियों में रहा हूँ जहाँ हम नेटवर्क पैकेट की प्रक्रिया करते हैं। इसलिए, हम टीसीपी से ऊपर के स्तर पर नहीं, बल्कि ईथरनेट या आईपी स्तर पर काम कर रहे हैं।
दिलचस्प बात यह है कि दोनों कंपनियों में C को C ++ से अधिक चुना गया था। एक कंपनी में, दो उत्पादों में से एक को लिनक्स कर्नेल के शीर्ष पर बनाया गया था, जबकि अन्य उत्पाद को लिनक्स यूजरस्पेस में बनाया गया था। लिनक्स कर्नेल के रूप में स्पष्ट रूप से उपयोग किए जाने वाले कर्नेल उत्पाद को C में क्रमादेशित किया जाता है, लेकिन उन्होंने उपयोक्ता उत्पाद के लिए भी C का उपयोग करना चुना। दोनों उत्पादों को लगभग 2000 से शुरू किया गया था (कर्नेल उत्पाद 2000 से थोड़ा पहले और उपयोगकर्ता 2000 के बाद थोड़ा उत्पाद)।
जिस कंपनी में मैं उसके बाद गया, वह उत्पाद C ++ पर नहीं, बल्कि C पर बनाया गया था। यह वास्तव में 1990 के दशक के मध्य से एक परियोजना का एक निरंतरता है, हालांकि हालिया प्रदर्शन सुधार मांगों के कारण, यह निर्णय लिया गया था कि अनिवार्य रूप से सब कुछ फिर से लिखा जाएगा। हमारे पास फिर से लिखने के कारण C ++ का चयन करने का विकल्प था, लेकिन ऐसा नहीं किया।
नेटवर्क पैकेट प्रोसेसिंग के क्षेत्र में, प्रदर्शन बहुत मायने रखता है। इसलिए, मैं अपनी हैश टेबल को मौजूदा हैश टेबलों की तुलना में उच्च प्रदर्शन पर लागू करना चाहता हूं। मैं, हैश टेबल लेखक नहीं हूँ, जो हैश फ़ंक्शन का उपयोग करने के लिए चयन करता है। शायद मैं प्रदर्शन चाहता हूं और मुरमुरश 3 के लिए जाना चाहता हूं । शायद मैं सुरक्षा चाहता हूं और SipHash के लिए जाना चाहता हूं । मेमोरी एलोकेटर स्पष्ट रूप से कस्टम हैं। वास्तव में, हमारे द्वारा उपयोग की जाने वाली सभी महत्वपूर्ण डेटा संरचनाएं उच्चतम संभव प्रदर्शन के लिए कस्टम-कार्यान्वित की गई हैं।
हालांकि ऐसा कुछ भी नहीं है जो C ++ के उपयोग को रोक देगा, यह आमतौर पर एक बुरा विचार है। पैकेट प्रति एक एकल अपवाद अपवाद के स्तर को पैकेट प्रसंस्करण दर को गिरा देगा! इसलिए, हम C ++ के अपवादों का उपयोग नहीं कर सकते। रास्ता बहुत धीमा है। हम पहले से ही डेटा स्ट्रक्चर्स को स्ट्रक्चर के रूप में लागू करने और फिर उन स्ट्रक्चर्स पर काम करने वाले फंक्शन्स को लागू करके ऑब्जेक्ट-ओरिएंटेड सी कोड का उपयोग कर रहे हैं। C ++ में वर्चुअल फ़ंक्शंस होने की अनुमति होगी, लेकिन फिर हर जगह उपयोग किए जाने पर फिर से वर्चुअल फ़ंक्शन कॉल प्रदर्शन को मार देगा। तो, यह स्पष्ट होना बेहतर है और एक फ़ंक्शन पॉइंटर है यदि वर्चुअल फ़ंक्शन कॉल की आवश्यकता है।
C ++ आपकी पीठ पीछे कई चीजें करेगा: मेमोरी एलोकेशन, आदि। दूसरी तरफ, C में आमतौर पर ऐसा नहीं होता है। आप एक फ़ंक्शन लिख सकते हैं जो मेमोरी आवंटित करता है, लेकिन आमतौर पर फ़ंक्शन के इंटरफ़ेस से यह स्पष्ट है कि आवंटन हो रहा है।
C में प्रोग्रामिंग करते समय आप किस प्रकार के माइक्रो-ऑप्टिमाइज़ेशन कर सकते हैं, इसके उदाहरण के रूप में, Linux कर्नेल में कंटेनर_ऑफ मैक्रो पर एक नज़र डालें। ज़रूर, आप कंटेनर ++ को C ++ कोड में उपयोग कर सकते हैं, लेकिन कौन करता है? मेरा मतलब है, यह अधिकांश सी कार्यक्रमों में पूरी तरह से स्वीकार्य है, लेकिन विशिष्ट सी ++ प्रोग्रामर तुरंत कुछ और प्रस्तावित करेंगे, जैसे कि एक लिंक की गई सूची जो लिंक नोड्स को अलग-अलग ब्लॉक के रूप में आवंटित करती है। हम ऐसा नहीं चाहते क्योंकि प्रदर्शन के लिए हर आवंटित मेमोरी ब्लॉक खराब है।
शायद केवल यही चीज हमें C ++ में फायदा पहुंचाती है कि C ++ टेम्पलेट मेटाप्रोग्रामिंग की अनुमति देता है, जिसका अर्थ है कि आप कभी-कभी फ़ंक्शन पैरामीटर होने के बावजूद वर्चुअल फ़ंक्शन कॉल से बच सकते हैं, और कंपाइलर को फ़ंक्शन को इनलाइन करने की अनुमति देते हैं। लेकिन टेम्पलेट मेटाप्रोग्रामिंग जटिल है, और हम सी में सभी आवश्यकताओं को पूरा करने में कामयाब रहे हैं, इसलिए सी ++ में इस सुविधा का लाभ इतना महत्वपूर्ण नहीं है।
कंपनियों में से एक में, हमारे पास वास्तव में एक कस्टम संकलित भाषा थी जहां सुविधाओं का हिस्सा लागू किया गया था। अनुमान करें कि संकलक की लक्षित भाषा क्या थी? सभा? नहीं, हमें 32-बिट और 64-बिट आर्किटेक्चर दोनों का समर्थन करना था। सी ++? निश्चित रूप से आप मज़ाक करते हैं। जाहिर है, यह जीसीसी के गणनात्मक गोटो के साथ सी था । इसलिए, कस्टम भाषा को C (या वास्तव में C का gcc संस्करण) जो संकलित गोटो का समर्थन करता है), और C संकलक ने असेंबली तैयार की।