2010-06-05 14 views
8

a specific problem की ऊँची एड़ी पर, एक स्व-उत्तर और टिप्पणियां, मैं समझना चाहता हूं कि यह उचित समाधान है, कामकाज/हैक या सिर्फ सादा गलत है। सूचक के लिए एक volatile क्वालीफायर के साथसख्त सूचक एलियासिंग: एक 'अस्थिर' सूचक/संदर्भ के माध्यम से उपयोग है?

T x = ...; 
if (*reinterpret_cast <volatile int*> (&x) == 0) 
    ... 

:

T x = ...; 
if (*reinterpret_cast <int*> (&x) == 0) 
    ... 

के रूप में:

विशेष रूप से, मैं कोड दुबारा लिखा।

चलो बस मान लें कि Tint के रूप में मेरी स्थिति में समझ में आता है। क्या यह volatile संदर्भ के माध्यम से पहुंचने वाला सूचक संकेतक को हल करता है?

एक संदर्भ के लिए, विनिर्देश से:

[नोट: अस्थिर कार्यान्वयन के लिए एक संकेत वस्तु को शामिल आक्रामक अनुकूलन से बचने के लिए है, क्योंकि वस्तु के मूल्य एक द्वारा जांच भी तरह से बदला जा सकता है कार्यान्वयन। विस्तृत अर्थशास्त्र के लिए 1.9 देखें। सामान्य तौर पर, अस्थिर के शब्दों करना है C++ में एक ही हो के रूप में वे सी में कर रहे हैं - अंत टिप्पणी]

संपादित करें:

उपरोक्त कोड में कम से कम जीसीसी 4.5 पर मेरी समस्या का समाधान किया ।

+0

यह प्रश्न ** ** स्पष्ट रूप से सी ++ विशिष्ट नहीं है। सी ++ - स्टाइल कास्ट सी को – curiousguy

+0

@ क्रिएटिव्यू सी और सी ++ में अलग-अलग भाषा नियमों में फिर से लिखा जा सकता है हालांकि –

+0

@MattMcNabb विभिन्न डब्लूआरटी 'अस्थिर' कैसे हैं? – curiousguy

उत्तर

15

अस्थिरता यहां आपको अपरिभाषित व्यवहार से बचने में मदद नहीं कर सकती है। इसलिए, यदि यह आपके लिए जीसीसी के साथ काम करता है तो यह भाग्य है।

मान लें कि टी एक पीओडी है। फिर, ऐसा करने का उचित तरीका

T x = …; 
int i; 
memcpy(&i,&x,sizeof i); 
if (i==0) 
    … 

वहां! कोई सख्त एलियासिंग समस्या नहीं है और कोई स्मृति संरेखण समस्या नहीं है। जीसीसी भी एक आंतरिक समारोह के रूप में memcpy संभालती है (इस मामले में कोई फंक्शन कॉल डाला गया है)।

+1

"अस्थिरता आपको यहां अपरिभाषित व्यवहार से बचने में मदद नहीं कर सकती" - क्यों? क्या आपके पास इस कथन के लिए कोई स्रोत है? – doublep

+5

सी ++ मानक, सेक्शन 3.10 पैराग्राफ 15 वह जगह है जहां आपको सख्त एलियासिंग के संबंध में देखने की आवश्यकता है। अस्थिरता से जुड़े अपवाद का कोई उल्लेख नहीं है। – sellibitze

+0

ऐसे मामले हैं जहां यह अपरिभाषित व्यवहार नहीं है। उदाहरण के लिए 'संरचना ए {int a; }; int मुख्य() {एक्स एक्स; * reinterpret_cast (& x) = 10; } '9.2/17' के अनुसार ठीक और पूरी तरह परिभाषित है। ऑब्जेक्ट टाइप 'int' है, और lvalue प्रकार' अस्थिर int 'भी है, इस प्रकार एलियासिंग ठीक हो जाता है। –

-3

अस्थिरता यहां आपको अपरिभाषित व्यवहार से बचने में मदद नहीं कर सकती है।

ठीक है, volatile के बारे में कुछ भी मानक में कुछ अस्पष्ट है। मैं ज्यादातर आपके उत्तर के साथ सहमत हूं, लेकिन अब मैं थोड़ा असहमत होना चाहता हूं।

यह समझने के लिए कि volatile का अर्थ है, मानक ज्यादातर लोगों के लिए स्पष्ट नहीं है, विशेष रूप से कुछ कंपाइलर लेखकों। यह सोचना बेहतर है: volatile (और केवल जब) का उपयोग करते समय, सी/सी ++ काफी उच्च स्तर असेंबली है।

volatile lvalue पर लिखते समय, संकलक एक स्टोर जारी करेगा, या एकाधिक स्टोर अगर कोई पर्याप्त नहीं है (volatile परमाणु नहीं दर्शाता है)।

volatile lvalue पर लिखते समय, संकलक एक लोड जारी करेगा, या एकाधिक लोड अगर कोई पर्याप्त नहीं है।

बेशक, जहां कोई स्पष्ट लोड या स्टोर नहीं है, संकलक केवल उन निर्देशों को जारी करेगा जो लोड या स्टोर को इंगित करते हैं।

sellibitze ने सबसे अच्छा समाधान दिया: थोड़ा पुनरावृत्तियों के लिए memcpy का उपयोग करें।

लेकिन अगर सब एक स्मृति क्षेत्र के लिए पहुंचता है, तो volatile lvalues ​​का कार्य पूर्ण हो यह पूरी तरह स्पष्ट है कि सख्त अलियासिंग नियम लागू नहीं है। यह आपके प्रश्न का उत्तर है।

+0

डाउनवोट क्यों? – curiousguy

+6

-1: सबसे पहले, यह एक मंच नहीं है; हम जवाब में अन्य उत्तरों को संबोधित नहीं करते हैं। अगर आपको लगता है कि आपके पास बेहतर जवाब है, तो एक प्रश्न लिखें जो प्रश्न को संबोधित करता है। दूसरा और सबसे महत्वपूर्ण बात यह है कि "अस्थिरता के बारे में कुछ भी मानक में कुछ हद तक अस्पष्ट है।" नहीं, यह नहीं है। मानक * बहुत * स्पष्ट है कि अमूर्त मशीन के संबंध में अस्थिर और अस्थिर काम कैसे करता है। –

+1

@ निकोलबोलस "_Second और अधिक महत्वपूर्ण बात यह है कि" अस्थिरता के बारे में कुछ भी मानक में कुछ हद तक अस्पष्ट नहीं है। "नहीं, यह नहीं है ._" बहुत से लोग सोचते हैं कि यह बेहद अस्पष्ट है। यदि आपको लगता है कि यह स्पष्ट है, तो कृपया इसका अर्थ बताएं, और मेरी व्याख्या सही है। – curiousguy

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