क्लैंग और जीसीसी बिल्टिन फ़ंक्शंस के एक समूह को परिभाषित करते हैं, मैं यहाँ शेष के उदाहरण का उपयोग करूँगा:

__builtin_sqrt(x)

हालांकि, मानक C99 निम्नलिखित को math.h में परिभाषित करता है

sqrt(x)

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

5
H Bellamy 8 मार्च 2017, 12:20
1
आपको सीधे __builtin_sqrt का उपयोग नहीं करना चाहिए। आपको sqrt का उपयोग करना चाहिए। कंपाइलर यह पहचान लेगा कि sqrt एक ऐसा फ़ंक्शन है जिसे वह जानता है और इसे __builtin_sqrt से बदल देता है। जिस समय इसे लागू किया गया था, उस समय जीसीसी में आंतरिक कार्य की धारणा नहीं थी, इसमें केवल बिल्टिन थे, जो उपयोगकर्ताओं के लिए उपलब्ध थे, इसलिए __buildin_sqrt ने उपयोगकर्ता कोड में काम करना समाप्त कर दिया, लेकिन यह एक ऐतिहासिक दुर्घटना है।
 – 
Marc Glisse
8 मार्च 2017, 14:02
सीधे इसका इस्तेमाल क्यों नहीं करते? संकलक विशिष्ट बिलिन प्राप्त करने के लिए #ifdefs के साथ भी नहीं? यदि नहीं, तो क्यों नहीं?
 – 
SO_fix_the_vote_sorting_bug
17 मई 2021, 21:20
@jdk1.0 मानक कोड समतुल्य होने पर लंबे, गैर-पोर्टेबल कोड का उपयोग क्यों करें?
 – 
Marc Glisse
17 मई 2021, 22:05

1 उत्तर

सबसे बढ़िया उत्तर

gcc मैन्युअल से:

जीसीसी आम तौर पर कुछ अंतर्निहित कार्यों को अधिक कुशलता से संभालने के लिए विशेष कोड उत्पन्न करता है; उदाहरण के लिए, एलोका को कॉल एकल निर्देश बन सकते हैं जो सीधे स्टैक को समायोजित करते हैं, और memcpy को कॉल इनलाइन कॉपी लूप बन सकते हैं। परिणामी कोड अक्सर छोटा और तेज़ दोनों होता है, लेकिन चूंकि फ़ंक्शन कॉल अब इस तरह प्रकट नहीं होते हैं, आप उन कॉलों पर ब्रेकपॉइंट सेट नहीं कर सकते हैं, न ही आप किसी भिन्न लाइब्रेरी से लिंक करके फ़ंक्शंस के व्यवहार को बदल सकते हैं। इसके अलावा, जब किसी फ़ंक्शन को एक अंतर्निहित फ़ंक्शन के रूप में पहचाना जाता है, तो GCC उस फ़ंक्शन के बारे में जानकारी का उपयोग उस फ़ंक्शन पर कॉल के साथ समस्याओं के बारे में चेतावनी देने के लिए कर सकता है, या अधिक कुशल कोड उत्पन्न करने के लिए, भले ही परिणामी कोड में अभी भी उस फ़ंक्शन के कॉल शामिल हों . उदाहरण के लिए, -Wformat के साथ प्रिंटफ को खराब कॉल के लिए चेतावनी दी जाती है जब प्रिंटफ बनाया जाता है और स्ट्रेलन को वैश्विक मेमोरी को संशोधित नहीं करने के लिए जाना जाता है।

लाइब्रेरी फ़ंक्शंस कंपाइलर के लिए बाहरी हैं, इसलिए यह उनके बारे में उसी हद तक तर्क नहीं कर सकता है जैसे कि बिलिन। उदाहरण के लिए, कंपाइलर निरंतर फोल्डिंग में बिल्टिन का उपयोग कर सकता है, उदाहरण के लिए। __builtin_sqrt(1) को 1 से बदलें, जबकि यह आमतौर पर कॉल टू लाइब्रेरी sqrt(1) के साथ ऐसा नहीं कर सकता है।

बिल्टिन का उपयोग पोर्टेबिलिटी को प्रभावित नहीं करता है, क्योंकि वे मानक सी लागू करते हैं, इसलिए उनके पास समान अर्थशास्त्र है।

6
Les 26 जून 2019, 13:20
...क्योंकि यह इसे __builtin_sqrt से बदल देता है।
 – 
el.pescado
8 मार्च 2017, 14:22
ऐसा लगता है कि GCC का -O3 पर समान परिणाम है: godbolt.org/g/J1ztkQ
 – 
H Bellamy
8 मार्च 2017, 15:47
मैं इस उत्तर को अस्वीकार कर दूंगा क्योंकि ऐसा लगता है कि इसका आधार गलत है?
 – 
H Bellamy
8 मार्च 2017, 15:48
मैंने जीसीसी दस्तावेज़ों से बेहतर उद्धरण शामिल करने के लिए अपना उत्तर अपडेट कर दिया है।
 – 
el.pescado
8 मार्च 2017, 15:56