2012-04-17 10 views
7

क्या पूरे कार्यक्रम के लिए कुछ ऑब्जेक्ट्स के लिए स्थैतिक ऑब्जेक्ट प्रारंभ करने का आदेश सुनिश्चित करने का कोई तरीका है। मेरे पास मेमोरी आवंटकों हैं जिन्हें मैं प्रोग्राम में पहली चीजों के रूप में आवंटित करना चाहता हूं, क्योंकि इनका उपयोग पूरे कार्यक्रम में किया जाएगा और मैं इन आवंटकों को बाद में सभी स्मृति आवंटित करने के लिए उपयोग करना चाहता हूं।कंपाइलर विशिष्ट मेमोरी प्रारंभिक

मुझे लगता है कि यह शायद संकलक विशिष्ट है क्योंकि मुझे विश्वास नहीं है कि सी ++ मानक इसकी अनुमति देता है। जीसीएल और वीएस -2010 के कंपाइलर के लिए ऐसा करने में मुझे दिलचस्पी रखने वाले दो कंपाइलर्स हैं। यदि कोई रास्ता है, तो क्या कोई समझा सकता है कि कैसे?

संपादित

मैं "पहले उपयोग पर निर्माण" क्योंकि allocators स्मृति की एक बड़ी ब्लॉक कि मैं इस कार्यक्रम के शुरू में प्रारंभ करना चाहते हैं का आवंटन किया जाएगा नहीं करना चाहती।

+1

आपका मतलब है "स्थिर वस्तु प्रारंभिकरण के आदेश को सुनिश्चित करने के लिए" या क्या? – Griwes

+1

किसी ने क्यों गिरा दिया? – chadb

+5

आप अपने प्रश्न को फिर से लिखना चाहते हैं। क्योंकि यह – Grizzly

उत्तर

7

आप संकलक विशिष्ट निर्देशों का उपयोग करके प्रारंभिकरण के क्रम को कुछ हद तक प्रभावित कर सकते हैं। एमएसवीसी में एक प्रगति

#pragma init_seg({ compiler | lib | user | "section-name" [, func-name]}) 

जो कुछ विशिष्ट मॉड्यूल के लिए प्राथमिकता निर्धारित कर सकता है। init_seg के लिए यह संदर्भ देखें।

जीसीसी कंपाइलर के पास संबंधित विशिष्ट प्रारंभिकता की प्राथमिकता को सेट करने के लिए एक समान/संबंधित विशेषता वाक्यविन्यास है। यह इस

Some_Class A __attribute__ ((init_priority (2000))); 
Some_Class B __attribute__ ((init_priority (543))); 

तरह लग रहा है और init_priority पर इस पृष्ठ पर समझाया गया है।

+1

बहुत दिलचस्प है। क्या आप एमएसवीसी के लिए कुछ_Class करने का उदाहरण प्रदान कर सकते हैं? – josephthomas

+1

@ बो पर्सन: क्या आप एमएसवीसी के लिए कुछ_Class का एक उदाहरण दिखाने में सक्षम होंगे? प्रलेखन पढ़ने के बाद मुझे नहीं लगता कि कुछ_Class ए के समान कुछ कैसे संभव है (हालांकि मुझे विश्वास है कि यह संभव है, दस्तावेज कहता है, हालांकि, मैं इसे प्राप्त करने में सक्षम नहीं हूं)। – chadb

+0

आप एमएसवीसी के लिए बिल्कुल वही कार्यक्षमता नहीं प्राप्त कर सकते हैं। आप उपयोगकर्ता कोड से पहले इसे आरंभ करने के लिए 'Some_Class' की ऑब्जेक्ट प्रारंभ करने वाली फ़ाइल में '#pragma init_seg (lib)' जोड़ सकते हैं। आप प्रत्येक व्यक्तिगत वस्तु के लिए सटीक प्राथमिकता नहीं प्राप्त कर सकते हैं। –

0

मुझे लगता है कि आप स्थैतिक प्रारंभिक आदेश फियास्को का जिक्र कर रहे हैं, जिससे आपके प्रोग्राम में एक अनिश्चित व्यवहार का आह्वान करने का मौका होता है जब एक स्थैतिक चर प्रारंभिक स्थिरता की स्थिति के आधार पर प्रारंभ किया जाता है (जो हो सकता है या नहीं उस समय अपने कन्स्ट्रक्टर को बुलाया गया है)।

इस समस्या का समाधान का इस्तेमाल पहली बार मुहावरा पर निर्माण, सी ++ पूछे जाने वाले प्रश्न यहाँ में वर्णित है:

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.15

+0

मैंने पहले इस पर ध्यान दिया, हालांकि, मैं "पहले उपयोग पर निर्माण" नहीं चाहता हूं क्योंकि आवंटकों को स्मृति की एक बड़ी ब्लॉक आवंटित की जाएगी जिसे मैं प्रोग्राम की शुरुआत में शुरू करना चाहता हूं। – chadb

+1

@ चाडब: शायद आपको विस्तार से वर्णन करना चाहिए कि आप क्या कर रहे हैं। क्योंकि आपके प्रश्न से मैं पूरी तरह से ठीक होने के लिए पहले उपयोग पर निर्माण मानता हूं (ध्यान दें कि पहला उपयोग स्थिर वस्तु के निर्माण के अंदर हो सकता है)। – Grizzly

+0

तो, इसका उपयोग करने के लिए पहले प्रारंभकर्ता द्वारा आपके मेमोरी आवंटन ट्रिगर होगा। – ams

0

इसके बजाय स्थिर आरंभीकरण पर नियंत्रण की कोशिश की है, जो केवल कारण आप घंटे या भविष्य में हास्यास्पद डिबगिंग समय के अधिक, main की शुरुआत में स्मृति के अपने पूल आवंटित करें। फिर भी आपको स्थाई init के सभी नुकसान के बिना अपनी पूर्व आवंटित स्मृति मिलती है।

+0

उन सभी स्थैतिक प्रारंभकर्ताओं के लिए थोड़ा देर हो चुकी है जो मुख्य से पहले चलती हैं और प्रश्न में स्मृति पर भरोसा करती हैं। – ams

+0

हार्वर्ड आर्क। प्रोसेसर को प्रोग्राम मेमोरी पर डेटा स्टोर करने के लिए स्थैतिक प्रारंभिकरण की आवश्यकता हो सकती है, आमतौर पर एवीआर यूसी पर केवल फ्लैश मेमोरी पढ़ती है। केवल पढ़ने के लिए स्मृति के रूप में आप रनटाइम आवंटित या प्रारंभ नहीं कर सकते हैं। –

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