2009-05-07 14 views
21

पर नहीं है, तो मुझे restrict की सामान्य समझ है लेकिन मैं कुछ अच्छे बिंदुओं को स्पष्ट करने की उम्मीद कर रहा हूं। मेरे पास एक ऐसा फ़ंक्शन है जो एक बफर से एक नल-टर्मिनेटेड स्ट्रिंग पढ़ता है और एक अन्य बफर में एक यूआरएल एन्कोडेड संस्करण लिखता है। समारोह इस हस्ताक्षर (वर्तमान में restrict के बिना) है:जब उपयोग करना है और

char const *StringUrlEncode(char const *unencoded, 
          char *encoded, 
          char *encodedEnd); 

unencoded मेरी अशक्त-समाप्त स्रोत स्ट्रिंग है। गंतव्य बफर करने के लिए लेकिन सहित नहीं स्थान बताया encoded और encodedEnd, जहां बफर में पहली char को encoded अंक और पहले चार को encodedEnd अंक के बाद बफर, समारोह यानी char रों लिखेंगे का प्रतिनिधित्व करती है encodedEnd तक - यह आपकी मूल begin/end इटरेटर जोड़ी है यदि आप सी ++ एसटीएल सम्मेलनों से परिचित हैं।

यदि मैं यह कार्य करने के लिए restrict जोड़ने के लिए, यह केवल पहले दो मापदंडों के लिए लागू किया जाना चाहिए:

char const *StringUrlEncode(char const *restrict unencoded, 
          char *restrict encoded, 
          char *encodedEnd); 

या वहाँ कुछ लाभ मैं सभी तीन पैरामीटर में जोड़कर समझने नहीं कर रहा हूँ है?

मैं देख सकता हूं कि इनपुट और आउटपुट बफर बनाने restrict संकलक को यह जानने में मदद करता है कि वे ओवरलैप नहीं करते हैं। लेकिन अंतिम पैरामीटर के बाद से, encodedEnd, केवल आउटपुट बफर के अंत को चिह्नित करने के लिए प्रयोग किया जाता है, मुझे लगता है कि restrict वास्तव में यहां कंपाइलर के लिए कोई मदद नहीं होगी (हालांकि मुझे लगता है कि यह जोड़ना नहीं होगा समारोह घोषणा के लिए अनावश्यक शोर)।

उत्तर

12

माइक एक्टन के आलेख here आज़माएं। प्रतिबंधित नहीं है क्योंकि इसका उपयोग न करने के प्रदर्शन के प्रभाव और गलत तरीके से इसका उपयोग करने के परिणामों दोनों के कारण डरावना है।

आपके मामले में, ऐसा लगता है कि आप सुरक्षित रूप से सभी तीन बिंदुओं तक सीमित रूप से लागू कर सकते हैं क्योंकि कोई भी समान स्मृति क्षेत्र नहीं है। हालांकि तीसरे सूचक पर इसका उपयोग करने से कोई प्रदर्शन लाभ नहीं होगा।

+1

मैंने माइक के लेख को पढ़ा है (अब दो बार) और यह एक अच्छी शुरुआत है, लेकिन मुझे कुछ प्रश्नों के साथ छोड़ दिया :-) –

+1

दिया गया लिंक गैर-कार्यात्मक है। Google सुझाव देता है कि http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html (2009-09-06 मान्य) पर एक अद्यतन संस्करण है लेकिन यह भी समस्याएं दे रहा है। कैश संस्करण Google पर उपलब्ध है। –

4

मुझे लगता है कि आप सही हैं कि यह चोट नहीं पहुंचाएगा। आपका लूप पॉइंटर (इसे पी कॉल करें) लूप के अंत में एन्कोडेड अंत के बराबर होगा। लेकिन लूप के बाद कुछ भी नहीं किया जाना चाहिए (या तो पी या एन्कोडेड एंड से), इसलिए यह कोई समस्या नहीं होनी चाहिए। मुझे नहीं लगता कि इससे मदद मिलेगी, या तो, क्योंकि एन्कोडेड से कुछ भी कभी लिखा या पढ़ा नहीं जाता है इसलिए इसे अनुकूलित करने के लिए कुछ भी नहीं है।

लेकिन मैं आपसे सहमत हूं कि पहले दो प्रतिबंध वास्तव में मदद कर सकते हैं।

+0

ध्यान दें कि एन्कोडेड डीरफ्रेंसिंग अनिश्चित व्यवहार है क्योंकि एन्कोडेड भी प्रतिबंधित है - इसलिए वास्तव में, इससे कोई फर्क नहीं पड़ता कि एन्कोडेड एंड प्रतिबंधित है या नहीं। – bdonlan

7

इस विशेष मामले में यह कोई फर्क नहीं पड़ता कि एन्कोडेड एंड प्रतिबंधित है या नहीं; आपने संकलक से वादा किया है कि कोई भी unencoded और एन्कोडेड, और इसलिए पढ़ता है और लिखता है एक दूसरे के साथ हस्तक्षेप नहीं करेगा।

असली कारण यह है कि प्रतिबंधित इस मामले में महत्वपूर्ण है इसके बिना संकलक पता नहीं कर सकते हैं कि लिखते हैं कि के माध्यम से इनकोडिंग को प्रभावित नहीं करेगा unencoded के माध्यम से पढ़ता है।उदाहरण के लिए, यदि

encoded == unencoded+1 

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

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