2010-05-01 12 views
11

क्या टाइपेडफ अभिन्न/फ्लोट प्रकार का उपयोग करके परिभाषित करने का कोई तरीका है जिसका कोई मतलब नहीं है?सी/सी ++ __restrict प्रकार

कुछ के बराबर (लेकिन आदिम निर्माण):

template < typename T > 
struct restrict { T* __restrict data; }; 

के रूप में संबंधित सवाल, यह संभव है जीसीसी पूछने के लिए क्या यह उर्फ ​​निर्धारित करता है/की सूचक है कोई अन्य नाम?

+0

मुझे लगता है, अगर मैं टाइप करता हूं तो यह संकलित करता है अगर मैं टाइप टाइपिफ़ कॉन्स डबल * __restrict प्रकार करता हूं; 'लेकिन क्या यह' टाइप' पर लागू डबल * या कुछ प्रकार की प्रतिबंधित प्रतिबंधित करता है? – Anycorn

+0

कोशिश करें और देखें। 'प्रतिबंधित' को C++ मानक द्वारा परिभाषित नहीं किया गया है, इसलिए ymmv। अगर मैं अपने अनुभव को सही तरीके से याद करता हूं, तो प्रतिबंधित जीसीसी में टाइपपीफ में भाग लेता है। – Potatoswatter

+0

@P मैं यह कैसे कर सकता हूं? सीधे असेंबली को देखो और अंतर देखें? सी 99 में प्रतिबंधित है, मैंने सोचा कि __restrict सी ++ था? – Anycorn

उत्तर

19

टिप्पणियों में उल्लेख के अनुसार, कई नए सी ++ कंपाइलर्स प्रतिबंधित प्रकार क्वालीफायर के सी 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 तक उचित अनुकूलन निष्पादित नहीं किया।

+0

में प्रतिबंधित उपयोग करने की अनुमति देता है "सी 99 टाइपिफ़ को समान रूप से परिभाषित करता है, सिवाय इसके कि क्वालीफायरों की सूची में प्रतिबंधित शामिल है।" मैंने [इस बारे में एक सवाल] बनाया है (http://stackoverflow.com/q/43631062/2542702) और हर कोई (जिसने अब तक टिप्पणी की है) सोचता है कि यह एक बुरा विचार है। क्या आप टिप्पणी कर सकते हैं? क्या यह वैध सी के साथ एक सूचक टाइप करने के लिए कानूनी सी है? –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^