2010-02-15 9 views
34

क्या कोई यह समझा सकता है कि वे क्या हैं और मुझे उनकी आवश्यकता क्यों होगी? अगर मुझे इंट्रिनिक्स का उपयोग करने की ज़रूरत है तो मैं किस प्रकार के अनुप्रयोगों का निर्माण कर रहा हूं?इंट्रिनिक्स क्या हैं?

+0

http://en.wikipedia.org/wiki/Intrinsic_function – sellibitze

उत्तर

26

आम तौर पर, "अंतर्निहित" उन कार्यों को संदर्भित करता है जो अंतर्निहित हैं - यानी अधिकांश मानक लाइब्रेरी फ़ंक्शन जो संकलक लाइब्रेरी में वास्तविक फ़ंक्शन को कॉल करने के बजाय इनलाइन उत्पन्न कर सकते हैं/उत्पन्न करेंगे। उदाहरण के लिए, जैसा कॉल: इस तरह

mov ecx, 10 
xor eax, eax 
mov edi, offset FLAT:array1 
rep stosb 

intrinsics कर रहे हैं विशुद्ध रूप से एक अनुकूलन: memset(array1, 10, 0) एक x86 के लिए की तरह कुछ के रूप में संकलित किया जा सकता है। इंट्रिनिक्स की "आवश्यकता" सबसे अधिक संभावना है जहां संकलक इंट्रिनिक्स का समर्थन करता है जो आपको कोड उत्पन्न करने देता है जो संकलक सीधे उत्पन्न नहीं कर सकता (या आमतौर पर नहीं)। एक स्पष्ट उदाहरण के लिए, x86 के लिए कुछ कंपेलरों में "एमएमएक्स इंट्रिनिक्स" है जो आपको "फ़ंक्शंस" का उपयोग करने देता है जो वास्तव में एमएमएक्स निर्देशों का प्रत्यक्ष प्रतिनिधित्व है।

5

इंट्रिनिक्स को संकलक द्वारा उन कार्यों के रूप में उजागर किया जाता है जो किसी भी लाइब्रेरी का हिस्सा नहीं हैं, प्रति से

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

+1

उपयोग केस: सिमड निर्देश सेट (एसएसई, अल्टीवेक, नियॉन) जहां कंपेलरों के लिए यह पता लगाना कठिन होता है कि उन्हें कहां उपयोग करना है, लेकिन पंजीकरण आवंटन/स्टैक फ्रेम प्रबंधन को असेंबलर के विरोध में सी में कोडिंग से अभी भी प्राप्त किया जा सकता है –

40

एक आंतरिक कार्य एक ऐसा फ़ंक्शन है जो फ़ंक्शन के लाइब्रेरी-प्रदान किए गए कार्यान्वयन को जोड़ने के बजाय, जब संभव हो तो संकलक सीधे लागू होता है।

एक आम उदाहरण strncpy() है।

लघु तारों के लिए, strncpy() पर फ़ंक्शन कॉल करने के लिए, जिसमें रिटर्न एड्रेस के साथ 'स्टैक फ्रेम' सेट करना शामिल है, बाइट्स की वास्तविक प्रतिलिपि की तुलना में अधिक समय का उपभोग करेगा। इससे भी बदतर, सीपीयू प्री-फ़ेच बफर पर प्रभाव कई घड़ी चक्रों के लिए CPU निष्पादन को रोक देगा।

इसके बजाय, आंतरिक फ़ंक्शन को फ़ंक्शन कॉल के बदले कंपाइलर द्वारा कार्यान्वित किया जाता है। strncpy() के उदाहरण में, बाइट-कॉपीिंग कोड सीधे उस स्थान पर उत्सर्जित होता है जहां strncpy() आक्रमण किया जाता है।

इस strncpy() उदाहरण के समान, प्रत्येक अंतर्निहित फ़ंक्शन को सीधे बाधाओं के पूरा होने पर ऑनलाइन कोड के रूप में लागू किया जाता है।

आंतरिक फ़ंक्शन की एक गैर-आंतरिक प्रतिलिपि आमतौर पर मानक लाइब्रेरी में मौजूद होती है, यदि फ़ंक्शन के पते की आवश्यकता होती है।

इनलाइन फ़ंक्शंस की तुलना में, आंतरिक फ़ंक्शन कंपाइलर द्वारा प्रदान किया जाता है। सी प्रोग्राम के स्रोत कोड में कोई स्थान नहीं है जहां आंतरिक कार्य लिखा गया है, न ही वहां एक लाइब्रेरी कार्यान्वयन है जिसे लिंक किया जाना चाहिए। एक इनलाइन फ़ंक्शन अलग है जिसमें संकलक इनलाइन फ़ंक्शन के लिए स्रोत कोड पढ़ता है, लेकिन बाद में यह समान होता है कि यह इनलाइन फ़ंक्शन का संकलित अनुवाद सीधे ऑब्जेक्ट कोड में छोड़ सकता है, फ़ंक्शन कॉल के ओवरहेड को छोड़कर।

संक्षेप में, एक आंतरिक funciton और एक इनलाइन फ़ंक्शन के बीच व्यावहारिक अंतर यह है कि आंतरिक कार्य "वर्तमान" हैं, भले ही आपके पास #include आवश्यक हेडर फ़ाइल नहीं है जिसमें फ़ंक्शन घोषणा शामिल है।इनलाइन फ़ंक्शन के लिए, फ़ंक्शन घोषणा के साथ हेडर फ़ाइल #include 'डी (या अन्यथा घोषित) होनी चाहिए।

3

'इंट्रिनिक्स' 'ऐसी भाषा की विशेषताएं हैं जो एक कंपाइलर प्रोग्राम घोषित करने के लिए किसी भी आवश्यकता के बिना पहचान और लागू करता है। संकलक करने के लिए संकलक एक रनटाइम लाइब्रेरी से लिंक कर सकता है या नहीं। C++ में उदाहरण के लिए, संरचना प्रतिलिपि आपरेशन निहित है:

struct { 
    int a; 
    char b [100]; 
    long c [27]; 
} s, t; 

... 
s = t; // this statement copies hundreds of bytes, likely with a rtl call 

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

आपके अन्य प्रश्नों के लिए, केवल अंतर यह है कि उन्हें होना चाहिए की घोषणा की। उदाहरण के लिए, एक सी ++ प्रोग्राम ट्रान्सेंडैंटल कार्यों का उपयोग कर गणित पुस्तकालय घोषणाओं में शामिल करना होगा:

#include <math.h> 

वहाँ अनुप्रयोगों जो intrinsics पर निर्भर का कोई खास पैटर्न है, यह संकलक लेखकों और प्रोग्रामर के लिए महत्व का मामला है।

संबंधित मुद्दे