2011-04-19 15 views

उत्तर

4

जहां तक ​​मुझे पता है, ऐसा लगता है कि कोई कुछ एमएसवीसी ++ विशिष्ट सेटिंग को संशोधित करने का इरादा रखता है। हालांकि, यह सेटिंग intrinsic pragma के लिए मान्य विकल्प नहीं है। दूसरी ओर _m_prefetchw एक 3 डी अब है! आंतरिक कार्य

सभी संकलक आंतरिक कार्यों की तरह, यह (संभवतः) तेजी से विधानसभा एक तरह से

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

x86_64/x64/amd64 सिस्टम पर एमएसवीसी पर, इनलाइन असेंबली समर्थित नहीं है, इसलिए अंतर्निहित हार्डवेयर की whizzbang सुविधाओं तक पहुंचने के लिए इस तरह के इंट्रिनिक्स का उपयोग करना चाहिए।

अंत में, यह ध्यान दिया जाना चाहिए कि _m_prefetchw एक 3 डी अब है! आंतरिक, और 3 डी अब! केवल एएमडी हार्डवेयर पर समर्थित है। संभवतः ऐसा कुछ नहीं है जिसे आप नए कोड के लिए उपयोग करना चाहते हैं (यानी आपको इसके बजाय एसएसई का उपयोग करना चाहिए, जो इंटेल और एएमडी हार्डवेयर दोनों पर काम करता है, और इसमें बूट करने के लिए और अधिक सुविधाएं हैं)।

-1

आंतरिक प्रगति संकलक को बताती है कि एक समारोह को व्यवहार माना जाता है। कंपाइलर फ़ंक्शन को कॉल कर सकता है और फ़ंक्शन कॉल को इनलाइन निर्देशों के साथ प्रतिस्थापित नहीं कर सकता है, अगर इसका बेहतर प्रदर्शन होगा।

स्रोत: http://msdn.microsoft.com/en-us/library/tzkfha43(VS.80).aspx

0

C में, यह कार्यान्वयन को पहचानता है (और परिभाषित करता है) यह इस पर निर्भर करता।

यदि कार्यान्वयन "आंतरिक" प्रीप्रोकैसिंग टोकन को नहीं पहचानता है, तो प्रज्ञा को अनदेखा किया जाता है।
यदि कार्यान्वयन इसे पहचानता है, जो भी परिभाषित किया गया है (और यदि कोई अन्य कार्यान्वयन इसे अलग-अलग परिभाषित करता है, तो अन्य कार्यान्वयन पर एक अलग चीज होती है)।

तो, कार्यान्वयन के लिए प्रलेखन की जांच करें जिसके बारे में आप बात कर रहे हैं (संपादित करें: और यदि आप विभिन्न स्रोतों पर अपने स्रोत को संकलित करने की अपेक्षा करते हैं तो इसका उपयोग न करें)।

मुझे अपने सिस्टम पर man gcc में "#pragma intrinsic" का कोई संदर्भ नहीं मिला।

+0

अच्छा, यह समझ में आता है, यह देखते हुए कि यह एक जीसीसी विकल्प नहीं है। मेरे पास मेरे जीसीसी मैनुअल में '__declspec' नहीं है - मुझे नहीं लगता कि इस सवाल के साथ क्या करना है। जीसीसी के अलावा दुनिया में बहुत से कंपाइलर हैं। बाकी का जवाब ठीक है हालांकि। –

+0

वे वास्तव में एमएसवीसी विशिष्ट pragmas हैं। –

+0

सी मानक (प्रश्न टैग किया गया है सी) स्पष्ट रूप से परिभाषित करता है कि '#pragma WHATEVER' के लिए क्या होता है। चूंकि ओपी यह नहीं कहता कि उसका वर्तमान कार्यान्वयन क्या है, मुझे लगता है कि वह मानक से अर्थ चाहता था। – pmg

1

सभी "#pragma" निर्देशों के साथ "#pragma intrinsic" (नोट वर्तनी) का अर्थ, एक कंपाइलर से दूसरे में भिन्न होता है। आम तौर पर, यह इंगित करता है कि बाहरी कार्य को कॉल करने की तरह एक विशेष चीज़ को कुछ इनलाइन कोड के साथ प्रतिस्थापित किया जाना चाहिए। कुछ मामलों में, यह प्रदर्शन में काफी सुधार कर सकता है, खासकर यदि संकलक कुछ या सभी तर्कों के लिए निरंतर मान निर्धारित कर सकता है (बाद की स्थिति में, संकलक फ़ंक्शन के मान की गणना करने और इसे स्थिर के साथ प्रतिस्थापित करने में सक्षम हो सकता है) ।

आम तौर पर, आंतरिक रूप से संसाधित कार्यों को किसी भी विशेष समस्या का सामना नहीं करना पड़ेगा। सबसे बड़ा खतरा यह है कि यदि कोई उपयोगकर्ता एक मॉड्यूल में एक कंपाइलर के आंतरिक फ़ंक्शन के समान नाम के साथ एक फ़ंक्शन को परिभाषित करता है, और उस फ़ंक्शन को किसी अन्य मॉड्यूल से कॉल करने का प्रयास करता है, तो संकलक इसके बजाय अपेक्षित निर्देश अनुक्रम के साथ फ़ंक्शन कॉल को प्रतिस्थापित कर सकता है। इसे रोकने के लिए, कुछ कंपाइलर डिफ़ॉल्ट रूप से आंतरिक कार्यों को सक्षम नहीं करते हैं (ऐसा करने से कुछ मानक-अनुरूप कार्यक्रमों के साथ उपरोक्त असंगतता हो सकती है) लेकिन उन्हें सक्षम करने के लिए #pragma निर्देश प्रदान करें। कंपाइलर इंट्रिनिक्स को सक्षम करने के लिए कमांड लाइन विकल्प का भी उपयोग कर सकते हैं (क्योंकि मानक वहां कुछ भी अनुमति देता है), या कुछ कार्यों को __memcpy() को आंतरिक के रूप में परिभाषित कर सकता है, और string.h के भीतर, memcpy को __memcpy में परिवर्तित करने के लिए # परिभाषित निर्देश का उपयोग करें प्रोग्राम्स जो # स्ट्रिंग.h शामिल हैं किसी अन्य उद्देश्य के लिए memcpy का उपयोग करने की अनुमति नहीं है)।

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