2011-06-30 14 views
8

आज मुझे एक pecularity का सामना करना पड़ा, हालांकि शायद वास्तव में महत्वपूर्ण नहीं है, फिर भी मुझे पहेली। शायद मैं ठीक से सी ++ को भी समझ नहीं रहा हूं। स्ट्रिंग शाब्दिक करने के लिए एक स्रोत फ़ाइल बिंदु अंदरलागू आंतरिक संबंध स्पष्ट आंतरिक संबंध ("स्थिर") के समान नहीं है?

कुछ सरणियों, इसलिए जैसे:

इन सूचक सरणियों के
const char* a[] = { "a", "b", "c" }; 
const char* b[] = { "d", "e"}; 
const char* c[] = { "f", "g"}; 

कोई भी कभी GetProcAddress को भेजी जा रही एक पुस्तकालय से एक समारोह सूचक को पुनः प्राप्त करने के अलावा अन्य किसी भी तरह से इस्तेमाल किया जाता है (यह एक गैर-अवरुद्ध गतिशील ओपनल/ईएफएक्स/कैप्चर फ़ंक्शन लोडर और संदर्भ निर्माता/प्रबंधक है)।

यह अंततः मेरे लिए हुआ कि मुझे शायद उन चर को static const के रूप में घोषित करना चाहिए क्योंकि उन्हें बहुत सी .cpp फ़ाइल के बाहर कहीं भी आवश्यकता नहीं है, इसलिए आंतरिक संबंध स्पष्ट रूप से उचित लग रहा था। उनके पास आंतरिक लिंकेज होना चाहिए (आईएसओ 14882 3.5 (3)), इसलिए हम केवल स्पष्ट नागरिक बन रहे हैं कि संकलक पहले से ही क्या मानता है।

निष्पक्ष परिवर्तन करने के परिणामस्वरूप निष्पादन योग्य आकार की 512 बाइट वृद्धि हुई। एक अतिरिक्त 512 बी वास्तव में कोई फर्क नहीं पड़ता, लेकिन यह समझ में नहीं आया कि सटीक एक ही चीज़ के परिणामस्वरूप अलग-अलग कोड होंगे। चूंकि static const बहिष्कृत है (आईएसओ 14882 7.3.1.1 (2)), मैंने एक ही नाम के साथ एक अनाम नामस्थान भी कोशिश की।

कोडांतरक स्रोत को देखते हुए पता चलता है कि स्पष्ट आंतरिक लिंकेज (static या namespace{}) .data बजाय .rdata में स्ट्रिंग शाब्दिक चले जाएँगे, और स्ट्रिंग शाब्दिक बजाय सभी होने का, सूचक-से-स्ट्रिंग-शाब्दिक सरणियों के साथ हो जाते हैं क्रमशः एक ब्लॉक में तार और सभी पॉइंटर्स। यहां शायद अलग-अलग आकार के कारण भी हैं - एक सेक्शन में दूसरे से डेटा को घुमाने की संभावना सेक्शन आकार की बाधा आ गई है। दिलचस्प बात यह है कि सभी 3 स्वाद अलग-अलग नामों को भी जोड़ते हैं।

अब मुझे आश्चर्य है: क्या मैं झूठ बोल रहा हूं, क्या उन पॉइंटर्स में आंतरिक संबंध नहीं होना चाहिए?

इसके अलावा, मेरी समझ में const पहले से ही केवल पढ़ने के लिए, inhowfar static const "केवल पढ़ने के लिए और अधिक" है (एक .rdata में चला जाता है और अन्य नहीं करता है)?

उत्तर

7

आपके सरणी घोषित const घोषित नहीं हैं, इसलिए वे आंतरिक रूप से आंतरिक संबंध नहीं हैं। आपके पास पॉइंटर्स-टू-कॉन्स के गैर-कॉन्स एरे हैं।

उस ने कहा, मुझे नहीं पता कि यह .rdata या .data में तारों का अंत क्यों प्रभावित करता है।

+0

ओह, ज़ाहिर है ... मेरी क्या बेवकूफ, स्पष्ट गलती है। दरअसल, यह 'const char * const [] 'होना चाहिए, जो अपेक्षा के अनुसार व्यवहार करता है, (आंतरिक रूप से आंतरिक संबंध, और समान उलझन में)। यह भी समझ में आता है कि अगर सरणी स्थिर नहीं है, तो गैर-स्थिर पॉइंटर्स-टू-शाब्दिक 'डेटा' में क्यों होगा। सिर्फ शाब्दिक, मुझे नहीं पता ... मैं उम्मीद करता हूं कि इन्हें किसी भी मामले में पढ़ा जाए। फिर भी, उत्कृष्ट पकड़। – Damon

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