2013-04-19 3 views
8

मैं कई संभावित प्रथाओं के बीच निर्णय लेने की कोशिश कर रहा हूं। कहें, मेरे फ़ंक्शन में कई() ब्लॉक हैं, जो डेटा पर काम करते हैं, जो उनके लिए अद्वितीय है।सशर्त प्रारंभिक कैसे संभाला जाता है और क्या यह एक अच्छा अभ्यास है?

  • क्या मुझे ब्लॉक के अंदर स्थानीय (ब्लॉक के लिए) डेटा घोषित और आरंभ करना चाहिए? क्या इसमें रनटाइम प्रदर्शन लागत है (स्टैक में रनटाइम आवंटन के कारण)?

  • या क्या मुझे फ़ंक्शन एंट्री पर सभी चर घोषित और/या प्रारंभ करना चाहिए, ताकि यह एक, संभवतः तेज़, ऑपरेशन ब्लॉक में किया जा सके?

  • या क्या मुझे अलग-अलग कार्यों में if() ब्लॉक अलग करना चाहिए, भले ही वे केवल कुछ पंक्तियां हों और कार्यक्रम में केवल एक ही इस्तेमाल किया जाए?

या क्या मैं एक और, क्लीनर, विकल्प का खुलासा कर रहा हूं? प्रश्न यह भी वर्तमान, सामान्य रूप में उत्तरदायी है?

उत्तर

8

क्या मुझे ब्लॉक के अंदर स्थानीय (ब्लॉक के लिए) डेटा घोषित और आरंभ करना चाहिए?

बिल्कुल: यह कार्यक्रमों को और अधिक पठनीय बनाने के लिए जाता है।

क्या इसमें रनटाइम प्रदर्शन लागत है (स्टैक में रनटाइम आवंटन के कारण)?

नहीं: सभी आवंटन पहले से किए जाते हैं - स्टैक पर स्थान फ़ंक्शन दर्ज करने पर सभी शाखाओं में चर के लिए आरक्षित है, न कि जब शाखा दर्ज की जाती है। इसके अलावा, यह आपको कुछ जगह भी बचा सकता है, क्योंकि गैर-ओवरलैपिंग शाखाओं में चर के लिए आवंटित स्थान को संकलक द्वारा पुन: उपयोग किया जा सकता है।

या क्या मुझे फ़ंक्शन एंट्री पर सभी चर घोषित और/या प्रारंभ करना चाहिए, ताकि यह एक, संभवतः तेज़, ऑपरेशन ब्लॉक में किया जा सके?

नहीं, यह तेज़ नहीं है, और थोड़ा और अपर्याप्त हो सकता है।

या क्या मुझे अलग-अलग कार्यों में if() ब्लॉक अलग करना चाहिए, भले ही वे केवल कुछ पंक्तियां हों और कार्यक्रम में केवल एक ही इस्तेमाल किया जाए?

इससे आपके प्रोग्राम की पठनीयता पर नकारात्मक प्रभाव पड़ता है।

+0

क्या आप दावा पर स्रोत और/या स्पष्टीकरण प्रदान कर सकते हैं "सभी आवंटन पहले किए गए हैं"। मुझे लगता है कि सी छोटी और उबाऊ भाषा है, लेकिन अब मेरा दिमाग बदल रहा है! – Vorac

+1

अधिक सटीक होने के लिए, ऐसे आवंटन और प्रारंभिक कार्य किए जाते हैं हालांकि संकलक निर्णय लेता है सबसे कुशल है। –

+0

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

0

आपके द्वारा बताए जा रहे विकल्पों में से, ब्लॉक के अंदर स्थानीय (ब्लॉक के लिए) डेटा घोषित करना और प्रारंभ करना आपके उद्देश्य को पूरा करेगा। बाकी चीजों को भूल जाओ।

4

scope of the variable जितना संभव हो सके छोटे रखने के लिए यह एक अच्छा अभ्यास है।
यदि आप शुरुआत में सभी चर एक बार घोषित करते हैं, और आप अक्सर अपने प्रोग्राम में
का उपयोग नहीं करते हैं। इसका कोई उपयोग नहीं है, इसमें अधिक मेमोरी होती है।

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

0

पूर्णता के लिए; दूसरा, आम तौर पर कम महत्वपूर्ण विचार स्टैक पैडिंग कंट्रोल/पैकिंग होता है, जो कि अगर आप सबकुछ पहले से घोषित नहीं करते हैं तो यह अधिक कठिन होता है।

अधिक जानकारी के लिए this देखें, हालांकि मुझे निम्नलिखित पैराग्राफ पर जोर देना से पहले किसी को भी पागल कुछ भी करता है: अपने सी कार्यक्रमों में

आमतौर पर, अदिश चर की छोटी संख्या के लिए, कुछ बाइट्स तुम बाहर bumming घोषणा के क्रम को बदलकर प्राप्त हो सकता है घोषणा आपको महत्वपूर्ण होने के लिए पर्याप्त नहीं बचाएगी। तकनीक अधिक दिलचस्प हो जाती है जब nonscalar चर - विशेष रूप से structs पर लागू होती है।

+0

भले ही कई कंपाइलर आपको परिभाषित करने के क्रम में स्टैक पर चर को व्यवस्थित कर सकते हैं, सी मानक को ऐसा करने की आवश्यकता नहीं है। कुछ कंपाइलर भी आपके लिए ऐसा कर सकते हैं (लेकिन मुझे इसके बारे में पता नहीं है)। – cmaster

+0

@cmaster: यह एक उत्कृष्ट बिंदु है, धन्यवाद। उत्सुकता के लिए: [1] (http://stackoverflow.com/q/4264896), [2] (http://stackoverflow.com/q/9535342), [3] (http://stackoverflow.com/ क्यू/238441), [4] (http://stackoverflow.com/q/1850556), [5] (http://stackoverflow.com/q/1102049), [6] (ftp: //gcc.gnu .org/पब/जीसीसी/शिखर सम्मेलन/2003/इष्टतम% 20Stack% 20Slot% 20Assignment.pdf)। मुझे लगता है कि मेरा मुद्दा मूक है। – tne

0

अब प्रदर्शन से संबंधित उत्तर।

क्या मुझे ब्लॉक के अंदर स्थानीय (ब्लॉक के लिए) डेटा घोषित और आरंभ करना चाहिए? क्या इसमें रनटाइम प्रदर्शन लागत है (स्टैक में रनटाइम आवंटन के कारण)?

स्थानीय चर का आवंटन व्यावहारिक रूप से मुफ़्त है। ज्यादातर मामलों में, यह वास्तव में मुफ़्त होगा, क्योंकि स्टैक पॉइंटर का अद्यतन उसी निर्देश में किया जाता है जो स्टैक के मान को लिखता है। डीलोकेशन या तो मुफ्त भी है (जब स्टैक से कुछ पॉप हो जाता है), या वापसी पर एक बार किया जाता है (जब एक स्टैक फ्रेम बनाया गया था)।

या क्या मुझे फ़ंक्शन एंट्री पर सभी चर घोषित और/या प्रारंभ करना चाहिए, ताकि यह एक, संभवतः तेज़, ऑपरेशन ब्लॉक में किया जा सके?

आवंटन लगभग स्वतंत्र है, चलने वाले निर्माता/विनाशक नहीं हैं। हालांकि यह आदिम प्रकारों के चर पर लागू नहीं होता है, यह स्मार्ट पॉइंटर्स और इसी तरह के सभी उपयोगकर्ता परिभाषित प्रकारों पर लागू होता है। यदि आप फ़ंक्शन की शुरुआत में एक स्मार्ट पॉइंटर घोषित करते हैं, लेकिन केवल उस समय का उपयोग करें, जिसे आप बनाते हैं, और बाद में स्मार्ट पॉइंटर को जितना आवश्यक हो उतना दोगुना कर दें।

इसके अलावा, यदि आप एक वैरिएबल घोषित करते हैं जहां आपके पास अपनी जरूरतों को शुरू करने के लिए जानकारी है, तो आप इसे सीधे उस स्थिति में बना सकते हैं, जिसे आप पहले डिफ़ॉल्ट रूप से बनाना चाहते हैं, इसे केवल इसके बाद के मूल्य को बदलने के लिए कई मामलों में असाइनमेंट ऑपरेटर)। तो, एक प्रदर्शन परिप्रेक्ष्य से, आपको हमेशा देर से चर और केवल उन ब्लॉकों में घोषित करना चाहिए जिन्हें उनकी आवश्यकता है।

या क्या मुझे अलग-अलग कार्यों में if() ब्लॉक अलग करना चाहिए, भले ही वे केवल कुछ पंक्तियां हों और कार्यक्रम में केवल एक ही इस्तेमाल किया जाए?

नहीं, यह एक प्रदर्शन परिप्रेक्ष्य से पूरी तरह से contraproductive है। प्रत्येक फंक्शन कॉल में ओवरहेड होता है, मुझे लगता है कि यह ज्यादातर समय 10 से 20 चक्रों के बीच है। आप उस समय काफी गणना कर सकते हैं।

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

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