टिप्पणियों में उल्लेख के अनुसार, कई नए सी ++ कंपाइलर्स प्रतिबंधित प्रकार क्वालीफायर के सी 99 कार्यान्वयन का समर्थन करते हैं। चूंकि restrict
सी ++ में आरक्षित कीवर्ड नहीं है, इसलिए कंपाइलर आम तौर पर __restrict
या __restrict__
का उपयोग करते हैं। GCC और Visual C++ दोनों इस अच्छी तरह से दस्तावेज करते हैं, सी 99 के स्पष्ट संदर्भ के साथ।
सी ++ 1998 मानक कहता है कि "typedef
विनिर्देशक नहीं ... एक प्रकार-विनिर्देशक छोड़कर विनिर्देशक के किसी भी प्रकार के साथ एक डीईसीएल-विनिर्देशक-सेक में संयुक्त किया जाएगा।" अनिवार्य रूप से, यह प्रकार-विनिर्देशक की एक सूची होनी चाहिए, जिसमें दो सीवी-क्वालीफायर, const
और volatile
शामिल हैं।
सी 99 टाइपिफ़ को समान रूप से परिभाषित करता है, सिवाय इसके कि क्वालीफायरों की सूची में restrict
शामिल है।
गैर मानक __restrict
के लिए टाइपपीफ में समान समर्थन की अपेक्षा करना उचित लगेगा ... लेकिन आप कभी नहीं जानते!
एक चतुर और आसान तरीका यह इस प्रकार है परीक्षण करने के लिए:
extern void link_fail();
typedef int *__restrict restricted_int_p;
void test(restricted_int_p a, restricted_int_p b) {
*a = 1;
*b = 2;
if (*a == 2) link_fail();
}
यह केवल तथ्य यह है कि अगर अनसुलझे link_fail
प्रतीक वस्तु फ़ाइल में पाया जाता है, लिंकर एक त्रुटि फेंक होगा दोहन करता है। यदि संकलक दो तर्कों को सही तरीके से प्रतिबंधित कर रहा है, तो b
के बाद भी इसे a
के मान को जानना चाहिए। इस प्रकार, अगर उत्पन्न ऑब्जेक्ट फ़ाइल से ब्लॉक हो तो इसे पूरे स्ट्रिप करना चाहिए क्योंकि यह कभी नहीं चलाया जाएगा।
ध्यान दें कि हालांकि जीसीसी ने कम से कम संस्करण 3.0 के बाद से प्रतिबंधित वाक्यविन्यास का समर्थन किया है, लेकिन वास्तव में version 4.5 तक उचित अनुकूलन निष्पादित नहीं किया।
स्रोत
2010-05-01 08:08:45
मुझे लगता है, अगर मैं टाइप करता हूं तो यह संकलित करता है अगर मैं टाइप टाइपिफ़ कॉन्स डबल * __restrict प्रकार करता हूं; 'लेकिन क्या यह' टाइप' पर लागू डबल * या कुछ प्रकार की प्रतिबंधित प्रतिबंधित करता है? – Anycorn
कोशिश करें और देखें। 'प्रतिबंधित' को C++ मानक द्वारा परिभाषित नहीं किया गया है, इसलिए ymmv। अगर मैं अपने अनुभव को सही तरीके से याद करता हूं, तो प्रतिबंधित जीसीसी में टाइपपीफ में भाग लेता है। – Potatoswatter
@P मैं यह कैसे कर सकता हूं? सीधे असेंबली को देखो और अंतर देखें? सी 99 में प्रतिबंधित है, मैंने सोचा कि __restrict सी ++ था? – Anycorn