2011-06-04 10 views
11

स्ट्रिंग शाब्दिक का भाषण, C99 मानक का कहना है (6.4.5.6):सी में, कॉन्स वैरिएबल मेमोरी में अलग होने की गारंटी है?

यह अनिर्दिष्ट है कि क्या इन सरणियों प्रदान की उनके तत्वों उचित मान है अलग हैं। यदि प्रोग्राम ऐसी सरणी को संशोधित करने का प्रयास करता है, तो व्यवहार अपरिभाषित है।

मुझे या तो समान चेतावनी या कॉन्स्ट चर के लिए स्पष्ट गारंटी नहीं मिल सका। संदर्भ &x == &y संदर्भ में const int x=12; const int y=12;1 का मूल्यांकन कर सकते हैं? एक कॉन्स वैरिएबल और स्ट्रिंग शाब्दिक (यानी &x == "\014\000\000"0 होने के लिए 32-बिट छोटे-एंडियन प्लेटफॉर्म पर भी) के बारे में क्या है?

इसके लायक होने के लिए, this blog post में "स्ट्रिंग अक्षर" अनुभाग प्रश्न का संदर्भ देता है।

+0

ध्यान दें कि जीसीसी केवल x' उत्सर्जित करेगा 'और' y' अपने पतों लिया जा सकता है, और में उस मामले में, यह उन्हें विभिन्न पते पर छोड़ देता है। – ninjalj

+2

यह भी देखें: [सी में कॉन्स्ट क्वालिफायर का गहरा विश्लेषण] (http://stackoverflow.com/questions/4275504/deep-analysis-of-const-qualifier-in-c) –

उत्तर

5

मानक में, समानता, में §6.5.9 "समानता ऑपरेटरों" चर्चा की है & में §6.5.3.2 "पता और अविवेक ऑपरेटरों" चर्चा की है, और const में §6.7.3 "क्वालिफायर टाइप करें" चर्चा की है। पॉइंटर समानता के बारे में प्रासंगिक मार्ग §6.5.9 है।6:

दो संकेत तुलना बराबर यदि और केवल यदि दोनों अशक्त संकेत दिए गए हैं, दोनों या समारोह, (एक वस्तु के लिए सूचक और इसकी शुरुआत में एक subobject सहित) एक ही वस्तु की ओर इशारा [या संकेत दिए गए हैं एक सरणी के अंत]

अतीत & का ही परिभाषा है कि "एकल & ऑपरेटर अपनी संकार्य का पता पैदावार है। [...] परिणाम ऑब्जेक्ट या उसके ऑपरेंड द्वारा निर्दिष्ट फ़ंक्शन के लिए एक सूचक है। "(§6.5.3.2.3)। दुर्भाग्य से "पता" शब्द की कोई औपचारिक परिभाषा नहीं है; लेकिन विशिष्ट वस्तुओं (== द्वारा परिभाषित समानता के लिए) के अलग-अलग पते हैं, क्योंकि पते पॉइंटर्स हैं जो उपरोक्त समानता की परिभाषा से अलग हैं।

const के अर्थ के रूप में, §6.7.3 का संकेत नहीं है const क्या एक वस्तु (जो निष्पादन वातावरण में डेटा भंडारण का एक क्षेत्र है ", सामग्री जिसमें से मूल्यों का प्रतिनिधित्व कर सकते हैं बनाता है पर कोई प्रभाव पड़ता है कि "§3.14 द्वारा)। एक फुटनोट आगे इंगित करता है कि "कार्यान्वयन की आवश्यकता ऐसी वस्तु के लिए भंडारण आवंटित करने की आवश्यकता नहीं है यदि उसका पता कभी भी उपयोग नहीं किया जाता है"। हालांकि यह गैर-मानक है, यह एक मजबूत संकेत है कि यदि पता उपयोग किया जाता है तो भंडारण प्रत्येक ऑब्जेक्ट के लिए आवंटित किया जाना चाहिए।

ध्यान दें कि यदि वस्तुओं const volatile हैं, तो यह काफी स्पष्ट है (के रूप में कभी हो सकता है volatile के रूप में स्पष्ट) कि वे एक ही पते के नहीं हो सकता, क्योंकि const volatile वस्तुओं कार्यान्वयन से परिवर्तनशील हैं। (§6.7.3.10 const volatile के उपयोग का एक उदाहरण है।)

यहां तक ​​कि गैर अस्थिर मामले में

, const केवल इंगित करता है कि कार्यक्रम के इस भाग वस्तु को संशोधित करने के लिए अनुमति नहीं है, नहीं है कि वस्तु पढ़ा है केवल सामान्य में। किसी अन्य चीज़ के साथ const ऑब्जेक्ट के संग्रहण को मर्ज करने के लिए, अशिष्ट कार्यान्वयनकर्ता को यह गारंटी देना होगा कि ऑब्जेक्ट को कुछ भी संशोधित नहीं कर सकता है। अलग संकलन के साथ कार्यान्वयन में बाहरी संबंध के साथ यह एक वस्तु के लिए काफी मुश्किल है (लेकिन निश्चित रूप से हम मानक से और जीते-अभ्यास-अभ्यास क्षेत्र में दूर हो रहे हैं)।

इस एक सी प्रोग्राम लिखने के बारे में है, तो आप अपने अवसरों वस्तुओं विभिन्न मूल्यों देकर बढ़ा सकते हैं:

const int x = __LINE__; 
const int y = __LINE__; 

इस बारे में सी के एक सैद्धांतिक मॉडल है, तो मैं करने के लिए जाना चाहते हैं वस्तुएं अलग हैं। आपको अपने पेपर में एक अनुच्छेद (यहां विस्तारित संस्करण) में उत्तरों को सारांशित करके इस विकल्प को उचित ठहराना होगा।

दूसरी तरफ, यदि यह एक अनुकूलक कंपाइलर लिखने के बारे में है, तो मुझे संदेह है कि यह स्थिरता को मर्ज करने के लिए कई वास्तविक-दुनिया कार्यक्रमों को चोट पहुंचाएगा। मैं एक एम्बेडेड कंपाइलर में विलय करने के लिए जाऊंगा, जहां उपयोगकर्ताओं को किनारे के मामलों के साथ इसे सुरक्षित रखने के लिए उपयोग किया जाता है और जहां सहेजी गई स्मृति गैर-नगण्य हो सकती है। मैं एक मेजबान मंच में विलय के खिलाफ जाऊंगा जहां कोई लाभ नगण्य होगा।

(N1256 उर्फ ​​C99 + TC3 से संदर्भ। मुझे नहीं लगता कि संस्करण एक फर्क नहीं पड़ता।)

+0

निश्चित रूप से यदि आप एक गैर-अनुरूप अनुकूलन को लागू करने जा रहे हैं, यहां तक ​​कि एक एम्बेडेड लक्ष्य पर भी, आपको इसे बंद करना और चालू करना चाहिए। इस मामले में जहां कहीं भी इसकी मांग है, आप इसे किसी भी/सभी लक्ष्यों के लिए भी पेशकश कर सकते हैं, और यह तय करने के लिए उपयोगकर्ता को छोड़ सकते हैं कि यह उनके कार्यक्रम को तोड़ देगा या नहीं और उन्हें अंतरिक्ष को बचाने की आवश्यकता है या नहीं। –

+0

मुझे आपके तर्क पसंद हैं, लेकिन गैर-अस्थिर कॉन्स पर आपके अनुच्छेद "यहां तक ​​कि ..." के संबंध में, 'जीसीसी' संकलित 'const int x = 12; int y; मुख्य() { वाई = एक्स; एफ(); वाई + = एक्स; printf ("% d \ n", y); } '' movl \t $ 12, ... 'और 'addl \t $ 12, ...', मानते हुए कि 'f()' कॉन्स्ट चर' x' नहीं बदलता है (यह मानता है कि 'f() '' y' बदल सकता है हालांकि, –

+0

@ पास्कल: इस परीक्षण के लिए विश्वसनीय होने के लिए, आपको जीसीसी को यह समझाने की आवश्यकता है कि 'x' का पता लिया गया है, यानी किसी स्थान पर' & x' है जहां इसे अनुकूलित नहीं किया जाएगा। आपको भी आवश्यकता है जीसीसी को समझें कि यह नहीं जानता कि 'f'' x' देख सकता है; 'x'' extern' और 'f' को किसी अन्य फ़ाइल में परिभाषित किया जाना चाहिए। – Gilles

6

जहां तक ​​मुझे पता है, मानक किसी भी प्रकार के दो नामित वस्तुओं को एक ही पते (यूनियन सदस्यों को छोड़कर) की अनुमति नहीं देता है। 6.5.9/6 से:

दो संकेत तुलना बराबर तभी अगर दोनों अशक्त संकेत दिए गए हैं, दोनों एक ही वस्तु के लिए संकेत दिए गए हैं ...

स्ट्रिंग शाब्दिक स्थिरांक चर नहीं हैं तो आपका माध्यमिक प्रश्न मूक है, और मुझे नहीं लगता कि 32-सीधा और अंतहीनता के साथ क्या करना है।

+0

ठीक है, दूसरे प्रश्न को ' कॉन्स चार टी [4] = {'ए', 'बी', 'सी'}; 'और '" एबीसी "' यदि आप चाहें तो। –

+2

उन्हें इसके साथ क्या करना है यह है कि 'x' (एक पूर्णांक 12) का ऑब्जेक्ट प्रस्तुति 32 बिट छोटे-एंडियन प्लेटफ़ॉर्म पर समान बाइट्स को स्ट्रिंग शब्दशः '014 \ 000 \ 000 "'। तो मेरा मानना ​​है कि सवाल का हिस्सा यह है कि स्ट्रिंग अक्षर को 'x' में तब्दील किया जा सकता है, या स्ट्रिंग अक्षर केवल स्ट्रिंग अक्षर में तब्दील हो सकते हैं। –

+0

@ स्टेव ओह, मैं देखता हूं। धन्यवाद। @ पास्कल वैसे, जहां तक ​​मुझे मानक पता है केवल यह कहता है कि स्ट्रिंग अक्षर के लिए मूल्य अस्पष्ट हो सकते हैं। लेकिन नकारात्मक के लिए साक्ष्य प्रदान करना मुश्किल है। –

3

const int x=12; 
const int y=12; 

x और y में विभिन्न चर (दोनों स्थिरांक-योग्य) और इसलिए अलग-अलग पतों हैं।

अन्य उदाहरण के लिए वही।

ध्यान दें कि const किसी ऑब्जेक्ट के लिए क्वालीफायर है। मेमोरी लेआउट के संबंध में, अगर यह वहां है या नहीं तो इससे कोई फर्क नहीं पड़ता है।

1

6.4.5/6 सरणियों स्ट्रिंग शाब्दिक करने के लिए इसी का कहना है:

यह unspeci फाई एड कि क्या इन सरणियों अलग उनके तत्वों उचित मान हो प्रदान की हैं।

तो यह एक विशिष्ट नियम है जो स्ट्रिंग अक्षर को फोल्ड करने की इजाजत देता है। मैं मानक में कुछ भी नहीं जानता जो अन्य वस्तुओं के लिए एक ही बात कहता है।

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