टाइप क्वालिफायर्स 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 = 40q = 20 + 30 = 50r = 30(अपरिवर्तित)restrictकंपाइलर को बताता है किcaया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__एक्सटेंशन के रूप में उपलब्ध)