C प्रोग्रामिंग भाषा में चार स्टोरेज क्लास हैं:
- auto
- extern
- static
- register
रजिस्टर वेरिएबल्स
- कीवर्ड: register
- रजिस्टर वेरिएबल्स के मान CPU रजिस्टर्स में संग्रहीत होते हैं, सामान्य वेरिएबल्स की तरह मेमोरी (RAM) में नहीं।
- रजिस्टर्स CPU में अस्थायी स्टोरेज यूनिट्स हैं।
- ये सामान्य वेरिएबल्स की तुलना में तेज एक्सेस टाइम प्रदान करते हैं।
उदाहरण 1: बेसिक उपयोग
#include <stdio.h>
int main() {
register int i;
for(i = 1; i <= 5; i++)
printf("%d ", i);
return 0;
}
आउटपुट
1 2 3 4 5
उदाहरण 2: डिफ़ॉल्ट मान
#include <stdio.h>
int main() {
register int a;
printf("%d", a); // अनिर्दिष्ट मान प्रिंट करता है (कंपाइलर पर निर्भर)
return 0;
}
आउटपुट
0 (या कोई गार्बेज मान - अनिर्दिष्ट व्यवहार)
नोट: रजिस्टर वेरिएबल्स ऑटोमेटिकली इनिशियलाइज़ नहीं होते (ग्लोबल/स्टेटिक के विपरीत)।
उदाहरण 3: एड्रेस लेने का प्रयास (त्रुटि)
#include <stdio.h>
int main() {
register int i = 10;
int *p;
// int *p = &i; // त्रुटि: रजिस्टर वेरिएबल का पता नहीं ले सकते
// printf("Value: %d, Address: %p", *p, p);
return 0;
}
आउटपुट
Error: address of register variable requested
महत्वपूर्ण प्रतिबंध
| ऑपरेशन | रजिस्टर वेरिएबल पर लागू? |
|---|---|
| मान असाइन करना | हाँ |
| मान पढ़ना | हाँ |
| पता लेना (&) | नहीं - कंपाइल टाइम एरर |
| sizeof ऑपरेटर | नहीं - कंपाइल टाइम एरर |
कब उपयोग करें
- अक्सर एक्सेस होने वाले वेरिएबल्स (लूप काउंटर्स, फ्लैग्स)।
- प्रदर्शन-महत्वपूर्ण कोड पथ।
- नोट: आधुनिक कंपाइलर (GCC, Clang -O2/-O3) स्वचालित रूप से ऑप्टिमाइजेशन के दौरान वेरिएबल्स को रजिस्टर्स में आवंटित करते हैं।
registerकीवर्ड केवल एक संकेत (hint) है, कंपाइलर इसे अनदेखा कर सकता है।
सारांश
registerतेज एक्सेस के लिए CPU रजिस्टर में स्टोरेज का अनुरोध करता है।- इसका पता नहीं लिया जा सकता।
- आधुनिक कंपाइलर्स में यह ज्यादातर अनावश्यक है क्योंकि ऑप्टिमाइज़र बेहतर निर्णय लेते हैं।