रेस्ट्रिक्ट

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

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

अनुकूलन
यदि कंपाइलर जानता है कि मेमोरी ब्लॉक में केवल एक पॉइंटर है, तो यह बेहतर अनुकूलित कोड तैयार कर सकता है। उदाहरण के लिए:

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

तब संकलक को यह मानने की अनुमति है,  , और   विभिन्न स्थानों को इंगित करें और एक पॉइंटर द्वारा संदर्भित मेमोरी स्थान को अपडेट करने से अन्य पॉइंटर्स द्वारा संदर्भित मेमोरी स्थान प्रभावित नहीं होंगे। प्रोग्रामर, कंपाइलर नहीं, यह सुनिश्चित करने के लिए ज़िम्मेदार है कि पॉइंटर्स समान स्थानों को इंगित नहीं करते हैं। कंपाइलर उदा. कोड को पुनर्व्यवस्थित करें, पहले सभी मेमोरी स्थानों को लोड करें, फिर परिणामों को मेमोरी में वापस लाने से पहले ऑपरेशन करें।

उपरोक्त असेंबली कोड छोटा है क्योंकि  केवल एक बार लोड किया जाता है. इसके अलावा, चूंकि कंपाइलर कोड को अधिक स्वतंत्र रूप से पुनर्व्यवस्थित कर सकता है, इसलिए कंपाइलर तेजी से निष्पादित होने वाला कोड उत्पन्न कर सकता है। उपरोक्त उदाहरण के दूसरे संस्करण में,  सभी ऑपरेशन इसके बाद हो रहे हैं   संचालन, यह सुनिश्चित करते हुए कि प्रोसेसर को प्रतीक्षा करने के लिए कोड के बीच में ब्लॉक नहीं करना पड़ेगा   ऑपरेशन पूरे हो गए हैं.

ध्यान दें कि वास्तविक जेनरेट किए गए कोड का व्यवहार भिन्न हो सकता है। उपरोक्त मिनी-उदाहरण के साथ लाभ छोटा होता है, और वास्तविक जीवन के मामलों में भारी मेमोरी एक्सेस करने वाले बड़े लूप वास्तव में प्रतिबंधित होने में मदद करते हैं।

जैसा कि ऊपर उल्लेख किया गया है, गलत कोड कैसे व्यवहार करता है यह अपरिभाषित व्यवहार है, कंपाइलर केवल यह सुनिश्चित करता है कि उत्पन्न कोड ठीक से काम करता है यदि कोड इरादे की घोषणा का पालन करता है।

C++ कंपाइलर्स द्वारा समर्थन
C++ के लिए मानक समर्थन नहीं है, लेकिन कई कंपाइलरों के समकक्ष होते हैं जो आमतौर पर C++ और C दोनों में काम करते हैं, जैसे कि जीएनयू कंपाइलर संग्रह और बजना  , और विज़ुअल सी++. इसके साथ ही,  उन तीन कंपाइलरों द्वारा समर्थित है। इन वैकल्पिक कीवर्ड की सटीक व्याख्या संकलक द्वारा भिन्न होती है:


 * जीसीसी और क्लैंग जैसे यूनिक्स-शैली कंपाइलरों में, __restrict और __restrict__ का मतलब बिल्कुल उनके C समकक्ष के समान है। एक्सटेंशन में उन्हें संदर्भ प्रकारों पर लागू करने की अनुमति देना शामिल है this.
 * विज़ुअल सी++ में, एकाधिक नो-अलियास क्वालिफायर प्रदान किए जाते हैं:
 * __declspec(restrict) फ़ंक्शन घोषणा पर लागू होता है और संकेत देता है कि लौटाया गया पॉइंटर उपनाम नहीं है।
 * __restrict का प्रयोग उसी स्थान पर किया जाता है restrict, लेकिन नो-अलियास संकेत जैसा प्रचारित नहीं होता है restrict. इसे यूनियन प्रकारों के लिए भी विस्तारित किया गया है।

संकलक चेतावनियाँ
गलत कोड को रोकने में मदद करने के लिए, कुछ कंपाइलर और अन्य उपकरण यह पता लगाने की कोशिश करते हैं कि ओवरलैपिंग तर्कों को चिह्नित पैरामीटर वाले फ़ंक्शन में कब पारित किया गया है restrict. सीईआरटी सी कोडिंग मानक के दुरुपयोग पर विचार करता है restrict और लाइब्रेरी फ़ंक्शंस को इसके (EXP43-C) सॉफ़्टवेयर बग के संभावित स्रोत के रूप में चिह्नित किया गया है, हालाँकि नवंबर 2019 तक इसके कारण होने वाली किसी भी कमज़ोरी का पता नहीं चला है।

बाहरी संबंध

 * Demystifying The Restrict Keyword: explanation and examples of use
 * Restricted Pointers in C: the original rationale behind the definition
 * Restricted Pointers in C: the original rationale behind the definition