2012-09-04 10 views
6

का आकार बढ़ाता है जिसमें मैंने एक सत्र में भाग लिया था जिसमें हमें सिखाया गया था कि हमें "नामस्थान स्टेड का उपयोग" नहीं करना चाहिए, इसके बजाय std namespace के कुछ कॉल का उपयोग करने के लिए "std :: cout" करें, द्विआधारीनामस्थान समावेशन exe

के आकार में वृद्धि होगी, मैंने निम्नलिखित प्रयोग के साथ इसकी पुष्टि करने की कोशिश की। कोड & इसके उत्पादन इस प्रकार है: -

[[email protected]]$ cat namespacestd.cpp 
    #include<iostream> 

    #ifdef STD 
      using namespace std; 
    #endif 

    int main() 
    { 
    #ifndef STD 
      std::cout<<"\n ==> Workign \n"; 
    #else 
      cout<<"\n ==> Workign \n"; 
    #endif 

    return 0; 

    } 


    [[email protected]]$ time g++ -c namespacestd.cpp -DSTD 

    real 0m0.246s 
    user 0m0.215s 
    sys  0m0.030s 
    [[email protected]]$ size namespacestd.o 
     text data  bss  dec  hex filename 
     310  8  1  319  13f namespacestd.o 
    [[email protected]]$ time g++ -c namespacestd.cpp 

    real 0m0.258s 
    user 0m0.224s 
    sys  0m0.034s 
    [[email protected]]$ size namespacestd.o 
     text data  bss  dec  hex filename 
     310  8  1  319  13f namespacestd.o 

    [[email protected]]$ time g++ -o namespacestd namespacestd.cpp -DSTD 

    real 0m0.293s 
    user 0m0.251s 
    sys  0m0.042s 
    [[email protected]]$ size namespacestd 
     text data  bss  dec  hex filename 
     1980  580  288 2848  b20 namespacestd 
    [[email protected]]$ time g++ -o namespacestd namespacestd.cpp 

    real 0m0.274s 
    user 0m0.239s 
    sys  0m0.035s 
    [[email protected]XP]$ size namespacestd 
     text data  bss  dec  hex filename 
     1980  580  288 2848  b20 namespacestd 
    [[email protected]]$ 

मैं अपने प्रयोग से देख

द्विआधारी

केवल

के आकार पर कोई प्रभाव नहीं है कि वहाँ संकलन समय में एक अंतर है।

कृपया मुझे ठीक कर लें मेरा निष्कर्ष त्रुटिपूर्ण हैं

धन्यवाद

+0

संकलन समय में अंतर हो सकता है (जैसा कि, 'उपयोग' से अधिक काम करने का कारण बन सकता है), लेकिन यह बहुत सैद्धांतिक है ... –

+0

मैं संकलन समय में अंतर का अधिक ध्यान नहीं लेता, जब तक बार-बार परीक्षण एक लगातार अंतर दिखाते हैं। 'g ++' उस प्रोग्राम को संकलित करने के लिए कम से कम कुछ दर्जन फ़ाइलों को दबाएगा, और समय अलग-अलग हो सकता है। –

+0

मैं मानता हूं कि संकलन समय अप्रासंगिक है – Fooo

उत्तर

3

नाम स्थान एसटीडी का उपयोग करते हुए सबसे compilers के साथ द्विआधारी आकार को प्रभावित नहीं करना चाहिए। इसे अभी भी किसी अन्य कारण से बचा जाना चाहिए:

नामस्थान std वास्तव में बड़ा है। वहां वास्तव में हजारों पहचानकर्ता हैं जो आपके कार्यक्रम के दायरे में हैं। इससे टकराव की संभावना आपके स्वयं के पहचानकर्ताओं या अन्य पुस्तकालयों के पहचानकर्ताओं के साथ बढ़ जाती है जो कुछ ग़लत आश्चर्य पैदा कर सकती हैं।

भी देखें इस संबंधित सवाल: Why is "using namespace std" considered bad practice?

2

वहाँ के आकार पर कोई प्रभाव नहीं है बाइनरी

वहाँ निष्पादन योग्य कोड और डेटा के लिए कोई फर्क नहीं होना चाहिए, के बाद से दोनों ही मामलों में आप एक ही वस्तु को एक ही वस्तु में कर रहे हैं, और उस ऑब्जेक्ट को उस नाम से ढूंढने के लिए लुकअप प्रक्रिया संकलन के दौरान होती है। हालांकि, यह संभव है कि कुछ परिस्थितियों में वे अलग-अलग मेटाडेटा उत्पन्न कर सकें, जैसे डीबगिंग जानकारी।

संकलन समय

स्रोत का कोई भी परिवर्तन संभावित संकलन समय बदल सकता है में अंतर है, लेकिन आप यह निर्धारित करने के अंतर सांख्यिकीय रूप से महत्वपूर्ण है के लिए पर्याप्त डेटा प्रस्तुत नहीं किया है। आपको प्रत्येक कॉन्फ़िगरेशन के लिए कई बार प्रयोग दोहराने की आवश्यकता होगी, दो नमूनों के माध्य और भिन्नता की गणना करें, और साधनों के अंतर के लिए एक महत्वपूर्ण परीक्षण लागू करें।

किसी भी घटना में, भले ही आप यह निर्धारित करते हैं कि ग्लोबल नेमस्पेस प्रदूषण को संकुचित रूप से तेज़ी से बनाता है, तो बचाए गए किसी भी समय नाम टक्कर को ट्रैक करने के संभावित रूप से बर्बाद होने की तुलना में छोटा होगा। std नामस्थान में बहुत सारे नाम हैं, जिनमें से कई आप अपने कोड में उपयोग करना चाहेंगे। नेमस्पेस प्रदूषण से बचने का यही कारण है; कोई भी दावा करता है कि यह बाइनरी के आकार को प्रभावित करेगा, यह पूरी तरह से समझ में नहीं आता कि वे किस बारे में बात कर रहे हैं।

2

द्विआधारी समान नहीं हैं, क्योंकि एक में आपके पास एसटीडी परिभाषित है, और दूसरे में आप नहीं करते हैं। मुझे विभिन्न आकार भी मिलते हैं।

हालांकि, यदि आप strip प्रतीकों हैं, तो आपको लगभग समान बाइनरी मिलेंगे (कुछ ईएलएफ हेडर पैरामीटर अलग-अलग हैं, जैसे संकलन समय)।

आप आप इस के लिए उदाहरण को बदलते हैं:

#include<iostream> 

    using namespace std; 


    int main() 
    { 
    #if 0 
      std::cout<<"\n ==> Workign \n"; 
    #else 
      cout<<"\n ==> Workign \n"; 
    #endif 

    return 0; 

    } 

और फिर #if 1 और #if 0 साथ संकलन, तुम भी स्ट्रिपिंग प्रतीकों के बिना, एक ही आकार के बाइनरी पाने के लिए जा रहे हैं।

संकलन समय में अंतर सामान्य है। मैक्रो परिभाषित के साथ, फ़ाइल बड़ी है, और प्रीप्रोसेसर को और करना है। हालांकि, नए पीसी इतने शक्तिशाली हैं कि मैं इस बार वृद्धि को अनदेखा कर दूंगा।

2

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

बहुत अच्छी सलाह, बकवास तर्क। वह तर्क समयपूर्व अनुकूलन है, और बूट करना गलत है।

हेडर फ़ाइल में using namespace std; का कभी भी उपयोग न करें। हेडर फ़ाइल में वह निर्देश वैश्विक नामस्थान को std नामस्थान से प्रत्येक फ़ाइल में नामांकित करता है जिसमें # आपकी हेडर फ़ाइल शामिल है।

यहां तक ​​कि एक स्रोत फ़ाइल में, कई std::whatever पसंद करते हैं क्योंकि यह कोड को अधिक पठनीय, अधिक समझने योग्य और त्रुटि से कम प्रवण बनाता है। टाइपिंग के कुछ पात्रों की एक बार की लागत पर, std:: उपसर्ग हमेशा संकलक के इरादे से संचार करता है, और अधिक महत्वपूर्ण बात यह है कि कोड के मानव पाठक/मानव रखरखाव के लिए। इसमें कोई संदेह नहीं है कि कोड मानक पुस्तकालय से कुछ आविष्कार कर रहा है।

using namespace <namespace_name>; निर्देश को नियोजित करने का एकमात्र औचित्य प्रोग्रामर के हिस्से पर टाइपिंग के कुछ पात्रों को बचाने के लिए आलसी आलस्य है। टाइपिंग के उन कुछ सहेजे गए पात्र बहुत बड़े खर्च पर आते हैं।

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

  • कोई संबंधित समस्या नहीं^_^