restrict कीवर्ड क्या है?
restrict कीवर्ड पहली बार C99 संस्करण में पेश किया गया था। आइए देखें कि यह वास्तव में क्या है।
मुख्य गुण
restrictकीवर्ड पॉइंटर डिक्लेरेशन्स के लिए एक टाइप क्वालिफायर के रूप में उपयोग किया जाता है- यह कीवर्ड कोई नई कार्यक्षमता नहीं जोड़ता। इसका उपयोग करके प्रोग्रामर कंपाइलर को एक ऑप्टिमाइज़ेशन के बारे में सूचित कर सकता है
- जब
restrictकीवर्ड पॉइंटरpके साथ उपयोग किया जाता है, तो यह कंपाइलर को बताता है किpउस ऑब्जेक्ट को एक्सेस करने का एकमात्र तरीका है जिसकी ओर यह इशारा करता है। इसलिए कंपाइलर कोई अतिरिक्त जांच नहीं जोड़ेगा - यदि प्रोग्रामर
restrictकीवर्ड का उपयोग करता है और फिर उपरोक्त शर्त का उल्लंघन करता है, तो यह अपरिभाषित व्यवहार उत्पन्न करेगा
उदाहरण
#include <stdio.h>
void my_function(int* x, int* y, int* restrict z) {
*x += *z;
*y += *z;
}
int main(void) {
int x = 10, y = 20, z = 30;
my_function(&x, &y, &z);
printf("%d %d %d", x, y, z);
return 0;
}
आउटपुट
40 50 30
व्याख्या
इस उदाहरण में, z को restrict के साथ घोषित किया गया है, जो कंपाइलर को वादा करता है कि z जिस ऑब्जेक्ट की ओर इशारा करता है, उसे केवल z के माध्यम से एक्सेस किया जाएगा (न कि x या y के माध्यम से)। इससे कंपाइलर को ऑप्टिमाइज़ेशन करने की अनुमति मिलती है, जैसे *z को रजिस्टर में कैश करना।
यदि हम कॉल करते: my_function(&z, &z, &z); - तो यह restrict अनुबंध का उल्लंघन करेगा और अपरिभाषित व्यवहार का कारण बनेगा।
समान पॉइंटर्स के बिना restrict
void no_restrict(int* x, int* y, int* z) {
*x += *z;
*y += *z;
// कंपाइलर को मान लेना चाहिए कि x, y, z ओवरलैप हो सकते हैं
// इसलिए यह *z को दोबारा लोड कर सकता है
}
restrict के साथ समान फ़ंक्शन
void with_restrict(int* restrict x, int* restrict y, int* restrict z) {
*x += *z;
*y += *z;
// कंपाइलर जानता है कि x, y, z ओवरलैप नहीं करते
// *z को एक बार लोड कर सकता है, रजिस्टर में रख सकता है
}
सामान्य उपयोग के मामले
- स्टैंडर्ड लाइब्रेरी फ़ंक्शन्स:
memcpy,memmove,strcpy, आदिrestrictका उपयोग करते हैं - संख्यात्मक कंप्यूटिंग: मैट्रिक्स ऑपरेशन्स, DSP लूप्स
- प्रदर्शन-महत्वपूर्ण कोड जहां पॉइंटर एलियासिंग ऑप्टिमाइज़ेशन को रोकता है
C++ में restrict
restrict C++ स्टैंडर्ड का हिस्सा **नहीं** है, लेकिन अधिकांश कंपाइलर्स इसे एक्सटेंशन के रूप में सपोर्ट करते हैं:
- GCC/Clang:
__restrictया__restrict__ - MSVC:
__restrict - C++26 में
[[assume]]एट्रिब्यूट के माध्यम से मानकीकरण प्रस्तावित है
// क्रॉस-प्लेटफॉर्म मैक्रो #if defined(__GNUC__) || defined(__clang__) #define RESTRICT __restrict__ #elif defined(_MSC_VER) #define RESTRICT __restrict #else #define RESTRICT #endif void func(int* RESTRICT a, int* RESTRICT b);