क्लैंग और जीसीसी बिल्टिन फ़ंक्शंस के एक समूह को परिभाषित करते हैं, मैं यहाँ शेष के उदाहरण का उपयोग करूँगा:
__builtin_sqrt(x)
हालांकि, मानक C99 निम्नलिखित को math.h
में परिभाषित करता है
sqrt(x)
पहले से मौजूद विधि के लिए बिल्टिन को परिभाषित करने वाले क्लैंग का क्या मतलब है? मैंने सोचा होगा कि एसक्यूआरटी जैसे सामान्य गणित कार्यों को बैकएंड द्वारा अनुकूलित किया जाएगा, इसलिए वास्तव में एक बिल्टिन की आवश्यकता नहीं है। स्पष्ट कारणों से, यह बिल्टिन मानक सी से कम पोर्टेबल हैं।
1 उत्तर
gcc मैन्युअल से:
जीसीसी आम तौर पर कुछ अंतर्निहित कार्यों को अधिक कुशलता से संभालने के लिए विशेष कोड उत्पन्न करता है; उदाहरण के लिए, एलोका को कॉल एकल निर्देश बन सकते हैं जो सीधे स्टैक को समायोजित करते हैं, और memcpy को कॉल इनलाइन कॉपी लूप बन सकते हैं। परिणामी कोड अक्सर छोटा और तेज़ दोनों होता है, लेकिन चूंकि फ़ंक्शन कॉल अब इस तरह प्रकट नहीं होते हैं, आप उन कॉलों पर ब्रेकपॉइंट सेट नहीं कर सकते हैं, न ही आप किसी भिन्न लाइब्रेरी से लिंक करके फ़ंक्शंस के व्यवहार को बदल सकते हैं। इसके अलावा, जब किसी फ़ंक्शन को एक अंतर्निहित फ़ंक्शन के रूप में पहचाना जाता है, तो GCC उस फ़ंक्शन के बारे में जानकारी का उपयोग उस फ़ंक्शन पर कॉल के साथ समस्याओं के बारे में चेतावनी देने के लिए कर सकता है, या अधिक कुशल कोड उत्पन्न करने के लिए, भले ही परिणामी कोड में अभी भी उस फ़ंक्शन के कॉल शामिल हों . उदाहरण के लिए, -Wformat के साथ प्रिंटफ को खराब कॉल के लिए चेतावनी दी जाती है जब प्रिंटफ बनाया जाता है और स्ट्रेलन को वैश्विक मेमोरी को संशोधित नहीं करने के लिए जाना जाता है।
लाइब्रेरी फ़ंक्शंस कंपाइलर के लिए बाहरी हैं, इसलिए यह उनके बारे में उसी हद तक तर्क नहीं कर सकता है जैसे कि बिलिन। उदाहरण के लिए, कंपाइलर निरंतर फोल्डिंग में बिल्टिन का उपयोग कर सकता है, उदाहरण के लिए। __builtin_sqrt(1)
को 1
से बदलें, जबकि यह आमतौर पर कॉल टू लाइब्रेरी sqrt(1)
के साथ ऐसा नहीं कर सकता है।
बिल्टिन का उपयोग पोर्टेबिलिटी को प्रभावित नहीं करता है, क्योंकि वे मानक सी लागू करते हैं, इसलिए उनके पास समान अर्थशास्त्र है।
__builtin_sqrt
से बदल देता है।
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।
#ifdef
s के साथ भी नहीं? यदि नहीं, तो क्यों नहीं?