2012-01-29 18 views
8

स्मार्ट पॉइंटर्स नीचे पॉइंटर्स हैं, तो क्या shared_ptr पैरामीटर को किसी फ़ंक्शन में परिभाषित करने का कोई तरीका है क्योंकि shared_ptr, या किसी अन्य प्रकार का कोई अन्य सूचक नहीं है?क्या __restrict__ को साझा_ptr <T> पर लागू किया जा सकता है?

या यह किसी कारण से अनावश्यक है?

मैं gcc> = 4.2 और llvm-clang> = 2.0 कंपाइलर्स से संबंधित हूं (अन्य कंपाइलरों के लिए उत्तर भी दिलचस्प होगा)।

+0

सी ++ में कोई 'प्रतिबंध' या '__restrict__' कीवर्ड नहीं है। यदि आप किसी विशेष कंपाइलर में भाषा एक्सटेंशन के बारे में पूछ रहे हैं, तो आपको यह कहना होगा। –

+0

@BenVoigt क्षमा करें - संपादन में स्पष्ट। – James

+3

यह असंभव लगता है कि प्रतिबंधित पॉइंटर्स पर काम करना चाहते हैं कि एक सूचक सूचक के साझा स्वामित्व का दावा करना चाहता है। उल्लेख नहीं है कि साझा स्वामित्व वाले सिस्टम में आप यह जानकर समाप्त होते हैं कि पॉइंटर्स वास्तव में अलग हैं। किसी भी मामले में, मुझे लगता है कि आपका फ़ंक्शन वास्तव में 'std :: shared_ptr ' 'के बजाय [प्रतिबंधित] पॉइंटर्स लेना चाहता है। –

उत्तर

7

बस .get() के साथ पॉइंटर्स निकालें और उन्हें __restrict__ के रूप में चिह्नित करें। याद रखें, फ़ंक्शन पैरामीटर में __restrict__ डालने से स्थानीय चर पर __restrict__ डालने जैसा ही है। विशेष रूप से, कंपाइलर आपको फ़ंक्शन को दो पॉइंटर्स से कॉल करने से रोकने का प्रयास नहीं करता है जो स्पष्ट रूप से उसी ऑब्जेक्ट को इंगित करता है; जैसे foo(i,i)

आप संकलक करने के लिए एक वादा है कि कुछ संकेत दिए गए एक-दूसरे का संदर्भ नहीं है, अधिक अनुकूलन करने के लिए अनुमति देता है संकलक बनाना चाहते हैं, तो नीचे दिए गए इस कोड का उपयोग और xp के माध्यम से अपना संचालन करते हैं और x और y के बजाय yp

#include<iostream> 
#include<memory> 
using namespace std; 

void foo(shared_ptr<int> x, shared_ptr<int> y) { 
     int * __restrict__ xp = x.get(); 
     int * __restrict__ yp = y.get(); 
} 

int main() { 
     shared_ptr<int> i = make_shared<int>(3); 
     shared_ptr<int> j = make_sharet<int>(4); 
     foo(i,j); 
} 
+2

आप क्यों कहते हैं कि 'प्रतिबंध' के रूप में फ़ंक्शन पैरामीटर चिह्नित करना स्थानीय 'प्रतिबंधित 'सूचक चर घोषित करने के लिए अलग है? क्या यह 'जीसीसी' अनुकूलन के साथ कुछ करना है या यह 'प्रतिबंध' का अंतर्निहित व्यवहार है (जिसे मैं वर्तमान में समझ नहीं पा रहा हूं;)) –

+0

मैं कहता हूं कि यह * अलग * नहीं है। मैं इसे और स्पष्ट होने के लिए पुन: पेश करने का प्रयास करूंगा। –

+0

मैं इसे लिखने जा रहा था, लेकिन मुझे '__restrict__' के लिए कोई व्याकरण नहीं मिला, जिसमें कहा गया था कि स्थानीय चरों पर इसकी अनुमति है या नहीं। क्या वहां कहीं दस्तावेज है? –

5

आप अंतर्निहित एक साझा सूचक आप स्पष्ट रूप से एक कार्यकर्ता दिनचर्या है कि एक गैर aliased सूचक पैरामीटर लेता प्रतिनिधि सकता है के साथ जुड़े वस्तु पर गैर aliased कार्रवाई करना चाहते हैं:

void worker (mytype *__restrict x, mytype *__restrict y) 
{ 
    // do something with x, y with a no-alias guarantee 
} 

int main() 
{ 
    std::shared_ptr<mytype> p(new mytype); 
    std::shared_ptr<mytype> q(new mytype); 

// explicitly delegate the shared object 
    worker(p.get(), q.get()); 

    return 0; 
} 

मैं नहीं कर रहा हूँ निश्चित रूप से आपके मन में क्या है, लेकिन इससे उच्च स्तरीय मेमोरी प्रबंधन को स्मार्ट पॉइंटर द्वारा सुरक्षित रूप से निपटाया जा सकता है, जबकि निम्न स्तर के काम संभवतः नो-उर्फ पॉइंटर्स के साथ अधिक कुशलतापूर्वक करते हैं।

@BenVoigt के रूप में इंगित किया गया है, restrict केवल c99 - c++ का ऑफिकल हिस्सा है इसके बारे में कुछ भी नहीं जानना चाहिए। MSVC इसे किसी भी तरह से __restrict के माध्यम से समर्थन करता है और जैसा कि आपने कहा है GCC में __restrict__ है।

उम्मीद है कि इससे मदद मिलती है।

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