2013-12-18 6 views
6

तो dot_productक्या यह "कॉन्स्ट प्रतिबंधित" पॉइंटर तर्कों के लिए कानूनी है?

float dot_product(const float* restrict a, const float* restrict b, unsigned n); 

के रूप में घोषित किया जाता है, साथ

dot_product(x, x, x_len) 

"अनिर्धारित" हो यह बुला होगा C99 मानक के अनुसार?

संपादित

x, एक सूचक, निश्चित रूप से है स्मृति के sizeof(float) * x_len बाइट्स, x_lenunsigned है की ओर इशारा करते। यह सवाल अलियासिंग के बारे में है।

+0

मेरे पास उद्धरण के लिए मानक नहीं है, लेकिन मुझे कल्पना करना है कि यह अनिर्धारित व्यवहार है। आप स्पष्ट रूप से संकलक को बता रहे हैं कि कोई अन्य पॉइंटर्स उसी स्मृति स्थान को संदर्भित नहीं करता है, फिर उस संकेत का उल्लंघन करता है। मुझे नहीं लगता कि 'const'ness उस पर असर डालेगा। –

+0

खुद का विरोध करने के लिए: यदि 'dot_product' एक डॉट उत्पाद की सामान्य परिभाषा है तो मुझे नहीं लगता कि यह * मायने रखता है *। यही है, 'प्रतिबंध' का उल्लंघन करना कोई फर्क नहीं पड़ता कि आप केवल सूचक पर पढ़ने के संचालन करते हैं। यह केवल तभी होता है जब आप लिखते हैं कि मैं मुद्दों की अपेक्षा करता हूं। –

+0

क्या मुझे "संपादन" को हटा देना चाहिए? यह अनावश्यक लगता है। मुझे आश्चर्य हुआ कि ** दो ** लोगों ने मेरे प्रश्न को गलत समझा। – MaxB

उत्तर

6

मेरे पास मूल C99 (यानी, ISO9899: 1999) टेक्स्ट नहीं है; मेरे पास केवल ISO9899:2007:TC3 की एक प्रति है। मुझे उम्मीद है कि इस दस्तावेज़ के पेज 111 से लिया गया यह टेक्स्ट सी 99 मानक में पाठ के समान ही है।

6.7.3.1 Formal definition of restrict 

... 

10. EXAMPLE 3 

The function parameter declarations 

    void h(int n, int * restrict p, int * restrict q, int * restrict r) 
    { 
     int i; 
     for (i = 0; i < n; i++) 
      p[i] = q[i] + r[i]; 
    } 

illustrate how an unmodified object can be aliased through two restricted 
pointers. In particular, if a and b are disjoint arrays, a call of the form 
h(100, a, b, b) has defined behavior, because array b is not modified within 
function h. 

यह स्पष्ट रूप से प्रपत्र आप, परिभाषित व्यवहार होने के रूप में के बारे में पूछा aliased संकेत केवल पढ़ने के लिए पहुँच के लिए उपयोग किया जाता है प्रदान की के कार्यों को कॉल करने के लिए लगता है। किसी भी अलियाड पॉइंटर्स के माध्यम से लिखना अनिर्धारित व्यवहार का आह्वान करेगा।

-1

हां। यह अपरिभाषित व्यवहार का आह्वान करेगा। restrict कीवर्ड प्रयोग किया जाता है

हैं और समारोह के रूप में घोषित किया जाता है:

float dot_product(const float* restrict a, const float* restrict b, unsigned n); 

तो संकलक ग्रहण करने के लिए अनुमति दी है कि अलग-अलग स्थानों के लिए a और b बिंदु और एक सूचक को अद्यतन करने के अन्य संकेत प्रभावित नहीं करेगा। प्रोग्रामर, संकलक नहीं, के लिए ज़िम्मेदार है यह सुनिश्चित करना कि पॉइंटर्स समान स्थानों पर इंगित न करें

अपने समारोह कॉल के बाद से

dot_product(x, x, x_len) 

जो कार्य करने के लिए एक ही सूचक x गुजर रहा है, a या b के किसी भी अद्यतन करने के अन्य के कारण अपरिभाषित व्यवहार को प्रभावित करेगा।

+2

यह 'प्रतिबंधित' पॉइंटर अलियासिंग प्रश्न को बिल्कुल संबोधित नहीं करता है। –

+0

नीचे मतदाता देखभाल की व्याख्या करने के लिए। – haccks

+2

मैं डाउनवॉटेड क्योंकि यह किसी भी तरह से प्रश्न से संबंधित नहीं है। –

1

सबसे पहले मुझे नहीं लगता कि कॉल स्वयं यूबी है, यूबी केवल फ़ंक्शन के अंदर ही हो सकता है, यदि पैरामीटर के रूप में पारित पॉइंटर्स का उपयोग इस तरह से किया जाता है जो restrict के विनिर्देश के साथ संघर्ष करता है। (यूबी कॉल के लिए ज्यादा समझ में नहीं आता है, अगर वह (डब्ल्यू/श) मना कर दिया गया है, तो इसे एक बाधा उल्लंघन किया जाना चाहिए था और यूबी नहीं।)

फिर, restrict से संबंधित यूबी केवल तभी दिखाई दे सकता है, अगर ऑब्जेक्ट की ओर इशारा किया गया है "किसी भी तरह से"। तो जब तक आपके वैक्टर संशोधित नहीं होते हैं, तब तक सब ठीक है। const योग्यता के कारण, आपके फ़ंक्शन के अंदर ऐसा नहीं होना चाहिए। और अगर बाहर कुछ (एक अलग थ्रेड या सिग्नल हैंडलर कहें) आपके वैक्टर को संशोधित करता है, तो आप किसी भी तरह खराब हो जाते हैं।

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