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

C में volatile और restrict टाइप क्वालिफायर्स उदाहरण के साथ समझें

टाइप क्वालिफायर्स C प्रोग्रामिंग भाषा में मौजूदा डेटा टाइप्स में विशेष विशेषताएं जोड़ते हैं।

C भाषा में तीन टाइप क्वालिफायर्स हैं: const, volatile, और restrict। यहां volatile और restrict समझाए गए हैं।

Volatile

एक volatile टाइप क्वालिफायर कंपाइलर को बताता है कि एक वेरिएबल शेयर्ड है। यानी, यदि इसे volatile घोषित किया जाता है तो एक वेरिएबल को अन्य प्रोग्राम्स (या एंटिटीज) द्वारा संदर्भित और बदला जा सकता है।

उदाहरण: volatile int x;

उपयोग के मामले

  • हार्डवेयर रजिस्टर्स (मेमोरी-मैप्ड I/O)
  • इंटरप्ट सर्विस रूटीन के साथ शेयर्ड वेरिएबल्स
  • मल्टी-थ्रेडेड प्रोग्राम्स में शेयर्ड वेरिएबल्स (साथ में एटॉमिक ऑपरेशन्स)
  • सिग्नल हैंडलर्स द्वारा मॉडिफाई किए गए वेरिएबल्स

उदाहरण

volatile int *ptr;
int a = 0;
ptr = &a;

// कंपाइलर ऑप्टिमाइजेशन नहीं कर सकता
*ptr += 4;
// *ptr += 5;  // इन्हें *ptr += 9 में ऑप्टिमाइज़ नहीं कर सकता
*ptr += 5;

यहां, कंपाइलर दो स्टेटमेंट्स *ptr+=4 और *ptr+=5 को एक स्टेटमेंट *ptr+=9 से प्रतिस्थापित नहीं कर सकता। क्योंकि, यह स्पष्ट नहीं है कि वेरिएबल 'a' को सीधे एक्सेस किया जा सकता है (या अन्य पॉइंटर्स के माध्यम से)।

Restrict

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

उदाहरण

restrict int *ptr;
int a = 0;
ptr = &a;

// कंपाइलर ऑप्टिमाइज़ कर सकता है
*ptr += 4;  // *ptr += 9 में संयोजित किया जा सकता है
*ptr += 5;

यहां, कंपाइलर दो स्टेटमेंट्स को एक स्टेटमेंट *ptr+=9 से प्रतिस्थापित कर सकता है। क्योंकि, यह सुनिश्चित है कि वेरिएबल को किसी अन्य संसाधन के माध्यम से एक्सेस नहीं किया जा सकता।

उदाहरण प्रोग्राम: restrict कीवर्ड का उपयोग

#include <stdio.h> 

void keyword(int *a, int *b, int *restrict c) {
    *a += *c;
    // चूंकि c restrict है, कंपाइलर 
    // अपने असेंबली कोड में पता c पर मान को 
    // रीलोड नहीं करेगा।
    *b += *c;
}

int main(void) {
    int p = 10, q = 20, r = 30;
    keyword(&p, &q, &r);
    printf("%d %d %d\n", p, q, r);
    return 0;
}

आउटपुट

40 50 30

व्याख्या

  • p = 10 + 30 = 40
  • q = 20 + 30 = 50
  • r = 30 (अपरिवर्तित)
  • restrict कंपाइलर को बताता है कि c a या b को एलियास नहीं करता, इसलिए *c को रजिस्टर में कैश किया जा सकता है।

तुलना

क्वालिफायरलागू होता हैउद्देश्यउदाहरण
constकोई भी ऑब्जेक्टमॉडिफिकेशन रोकता हैconst int x = 5;
volatileकोई भी ऑब्जेक्टऑप्टिमाइजेशन रोकता है (बाहरी परिवर्तन संभव)volatile int *hw_reg;
restrictकेवल पॉइंटर्सकोई एलियासिंग नहीं (ऑप्टिमाइजेशन सक्षम करता है)void *restrict ptr;

मानक अनुपालन

  • const, volatile: C89/C90 से मानक
  • restrict: C99 में जोड़ा गया (C++ में मानक नहीं, लेकिन __restrict या __restrict__ एक्सटेंशन के रूप में उपलब्ध)
  1. C भाषा में लूप कंट्रोल स्टेटमेंट्स क्या हैं? फ्लो चार्ट और प्रोग्राम के साथ समझाएं C भाषा में लूप कंट्रोल स्टेटमेंट्स क्या हैं? फ्लो चार्ट और प्रोग्राम के साथ समझाएं

    लूप कंट्रोल स्टेटमेंट्स स्टेटमेंट्स के सेट को दोहराने के लिए उपयोग किए जाते हैं। वे हैं: for लूप while लूप do-while लूप for लूप सिंटैक्स for(initialization; condition; increment/decrement) { // लूप बॉडी } फ्लो चार्ट (Condition पर वापस) आरंभीकरण - आमतौर पर एक असाइनमेंट स्टेटमेंट जो लूप क

  1. इमेज एरे क्या है? C++ में उदाहरण सहित समझाएं इमेज एरे क्या है? C++ में उदाहरण सहित समझाएं

    एरे डेटा के संग्रह को संग्रहीत और पुनर्प्राप्त करने का एक सुविधाजनक तरीका है। OpenCV में, हम इस अवधारणा का उपयोग कई इमेज को इमेज एरे में लोड करने और उन्हें एरे के इंडेक्स नंबर का उपयोग करके दिखाने के लिए कर सकते हैं। निम्नलिखित प्रोग्राम एक मैट्रिक्स एरे में कई इमेज लोड करता है और इंडेक्स नंबर द्वार

  1. C# में मूल्य प्रकार और संदर्भ प्रकार की अवधारणा समझाएं और तुलना करें C# में मूल्य प्रकार और संदर्भ प्रकार की अवधारणा समझाएं और तुलना करें

    सामान्य तौर पर, C# में सभी प्रकारों को दो मुख्य श्रेणियों में विभाजित किया जा सकता है − मूल्य प्रकार और संदर्भ प्रकार। आइए प्रत्येक प्रकार को विस्तार से देखें।मूल्य प्रकारमूल्य प्रकार के वेरिएबल्स सीधे अपने डेटा को समाहित करते हैं। प्रत्येक वेरिएबल की अपने डेटा की अपनी कॉपी होती है। इसलिए मूल्