Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C में रेस्ट्रिक्ट कीवर्ड

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);
  1. - C# में 'this' कीवर्ड

    C# में this कीवर्ड का उपयोग क्लास के वर्तमान इंस्टेंस को संदर्भित करने के लिए किया जाता है। इसका उपयोग मेथड पैरामीटर्स और क्लास फील्ड्स के बीच अंतर करने के लिए भी किया जाता है यदि दोनों का नाम समान हो। this कीवर्ड का एक अन्य उपयोग एक कंस्ट्रक्टर से उसी क्लास में दूसरे कंस्ट्रक्टर को कॉल करना है।

  1. - Python में assert कीवर्ड

    हर प्रोग्रामिंग भाषा में प्रोग्राम निष्पादन के दौरान उत्पन्न अपवादों को संभालने की सुविधा होती है। Python में assert कीवर्ड का उपयोग त्रुटि को पकड़ने और सिस्टम-जनित त्रुटि संदेश के बजाय उपयोगकर्ता-परिभाषित त्रुटि संदेश दिखाने के लिए किया जाता है। इससे प्रोग्रामर के लिए त्रुटि का पता लगाना और उसे ठीक

  1. - Python में कीवर्ड्स

    अन्य भाषाओं की तरह, Python में भी कुछ रिज़र्व्ड वर्ड्स होते हैं। इन शब्दों का विशेष अर्थ होता है। कभी-कभी यह एक कमांड हो सकता है, या एक पैरामीटर आदि। हम कीवर्ड्स को वेरिएबल नाम के रूप में उपयोग नहीं कर सकते। Python के कीवर्ड्स हैं: TrueFalseclassdefreturn ifelifelsetryexcept raisefinallyforinis no