2010-11-14 15 views
5

सी में थोड़ी देर के लिए प्रोग्रामिंग के बाद, मैंने अंततः सी ++ सीखने का फैसला किया। यह मुझे परेशान करने वाला है, क्योंकि सी में मानक 'हैलो वर्ल्ड' आमतौर पर ~ 16 केबी होता है, जिसमें आपके कंपाइलर फेंकने वाले सभी क्रूड भी शामिल होते हैं। (Stdio का उपयोग)संकलित सी ++ निष्पादन योग्य विशाल?

हालांकि, जब मैं एक सी ++ निष्पादन योग्य हैलो दुनिया कर रहा हूं, तो फाइल ~ 470 केबी है! मैं आगे बढ़ गया और iostream के बजाय cstdio का इस्तेमाल किया, सोच रहा है कि यह एक फर्क पड़ता है और यह किया।

मेरा प्रश्न है: जब मैं आईस्ट्रीम शामिल करता हूं, तो मेरे निष्पादन योग्य आकार का आकार क्यों होता है?

संपादित करें: मैं जी का उपयोग कर रहा ++ (देव-सीपीपी आईडीई के साथ, लेकिन मैं सीएल paramaters जोड़ने का तरीका पता लगा सकते हैं)

+0

मैं यह इंगित करना चाहता हूं कि देव-सी ++ जीसीसी के * पुराने * पुराने संस्करण के साथ आता है। WxDev-C++ या कोड :: ब्लॉक पर जाने पर विचार करें, जिनमें से दोनों अब तक अद्यतित हैं। – greyfade

उत्तर

6

एक शब्द में, प्रतीकों शामिल के रूप में एसटीएल के कई हिस्सों सहित रहे हैं।

सी ++ मानक पुस्तकालय आपके प्रोग्राम के प्रतीकों के लॉट प्रस्तुत करता है, क्योंकि अधिकांश लाइब्रेरी मुख्य रूप से हेडर फ़ाइलों में मौजूद है।

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

, पर ध्यान दें:

$ cat hello.c 
#include <stdio.h> 
int main() { 
    printf("%s\n", "Hello, world!"); 
    return 0; 
} 
$ cat hello.cpp 
#include <iostream> 
int main() { 
    std::cout << "Hello, world!\n"; 
    return 0; 
} 
$ gcc hello.c -o hello-c 
$ g++ hello.cpp -o hello-cpp 
$ gcc hello.c -ggdb -o hello-c-debug 
$ g++ hello.cpp -ggdb -o hello-cpp-debug 
$ gcc hello.c -s -o hello-c-stripped 
$ g++ hello.cpp -s -o hello-cpp-stripped 
$ gcc hello.c -s -O3 -o hello-c-stripped-opt 
$ g++ hello.cpp -s -O3 -o hello-cpp-stripped-opt 
$ ls -gG hello* 
-rwxr-xr-x 1 6483 Nov 14 15:39 hello-c* 
-rw-r--r-- 1 79 Nov 14 15:38 hello.c 
-rwxr-xr-x 1 7859 Nov 14 15:40 hello-c-debug* 
-rwxr-xr-x 1 7690 Nov 14 15:39 hello-cpp* 
-rw-r--r-- 1 79 Nov 14 15:38 hello.cpp 
-rwxr-xr-x 1 19730 Nov 14 15:40 hello-cpp-debug* 
-rwxr-xr-x 1 5000 Nov 14 15:45 hello-cpp-stripped* 
-rwxr-xr-x 1 4960 Nov 14 15:41 hello-cpp-stripped-opt* 
-rwxr-xr-x 1 4216 Nov 14 15:45 hello-c-stripped* 
-rwxr-xr-x 1 4224 Nov 14 15:41 hello-c-stripped-opt* 

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

+1

+1! आप एसटीएल में डीबगिंग प्रतीकों के ** ** ** पा सकते हैं। – jwueller

+0

हाय, परिणाम करने के लिए समय निकालने के लिए धन्यवाद। मैंने इसे '-s -O3' झंडे का उपयोग करके खिड़कियों में किया, और फ़ाइल का आकार 475kb से 263kb तक कम हो गया। यह मदद करता है, लेकिन क्या मैं और कर सकता हूं? – Saustin

+1

@ सस्टिन: एक नया कंपाइलर का उपयोग करें। आप एक * बहुत * पुराने का उपयोग कर रहे हैं। यह शायद कुछ क्रुफ्ट के साथ आता है जो नए संस्करणों पर globbed नहीं मिलता है। देव-सी ++ वैसे भी अनियमित है, इसलिए इसका उपयोग करने के लिए कोई अन्य कारण नहीं है जब कई अन्य बेहतर विकल्प हैं। मेरा मतलब है, सबसे हालिया रिलीज 2005 में थी! – greyfade

7

क्योंकि आप iostreams का उपयोग करके मानक पुस्तकालय के अधिकांश में घसीटा गया है। हालांकि यह एक चीज है हालांकि आपके कार्यक्रम बड़े हो जाते हैं, यह एक ओवरहेड के कम और कम दिखाई देगा।

हालांकि आप शायद मानक लाइब्रेरी के साझा लाइब्रेरी संस्करण का उपयोग करके संकलित करना चाहते हैं और अधिकांश कंपाइलर/ऑपरेटिंग सिस्टम आपको ऐसा करने देंगे ताकि आपको अपने निष्पादन योग्य में सभी मानक लाइब्रेरी शामिल नहीं करनी पड़े। आप किस कंपाइलर का उपयोग कर रहे हैं और हम शायद यह सलाह दे सकते हैं कि ऐसा कैसे करें।

वीसी कमांड लाइन वाली विंडो पर, उदाहरण के लिए/MD कमांड लाइन विकल्प का उपयोग करें।

+0

मैं जी ++ डब्ल्यू \ देव-सीपीपी का उपयोग कर रहा हूं। – Saustin

2

मुझे लगता है कि होता है कि <iostream> शामिल करके आप अप्रत्यक्ष रूप से इस तरह के <string> जो बारी में <vector> आदि

+0

इस उत्तर को सी-शर्तों में रखने के लिए, यह putc बनाम printf का उपयोग करने के बीच अंतर है। printf कोड में बहुत सारी कार्यक्षमता है जो (अपेक्षाकृत) आपके सी निष्पादन योग्य बनाम एक साधारण पुट फ़ंक्शन को नौका देती है। सस्टिन की स्थिति के लिए, प्रिंट प्रिंट के सापेक्ष "विशाल" हैं, और एसटीएल के सापेक्ष "विशाल" है। – franji1

2

यह कंपाइलर (और विकल्प) का एक आर्टिफैक्ट है जो आप लगभग किसी भी चीज़ से उपयोग करते हैं। एमएस वीसी ++ के साथ, मेरे द्वारा उपयोग किए गए कंपाइलर झंडे के आधार पर मैं कहीं भी ~ 8 के से ~ 110 के लिए प्राप्त कर सकता हूं। MinGW का उपयोग करके, मुझे 24-25K (फिर से, झंडे के आधार पर) मिलता है।

बस अगर आप सोच रहे हैं, तो मुझे लगता है कि वीसी ++ के साथ मुझे प्राप्त होने वाली बड़ी रेंज अधिकतर इसके झंडे को बेहतर तरीके से जानने का परिणाम है। MinGW केवल एक छोटी सी सीमा को कवर कर सकता है, भले ही मुझे यह बेहतर लगे, लेकिन इसके झंडे के सीमित ज्ञान के कारण मैं डिफ़ॉल्ट रूप से जो कुछ करता हूं उसे स्वीकार कर रहा हूं; मुझे पता है कि ऑप्टिमाइज़ेशन को चालू और बंद कैसे करें, लेकिन इससे अधिक कुछ करने के लिए चीजों को सावधानी से देखना होगा।

1

मिनजीडब्ल्यू (जी ++) वास्तव में बड़ी फाइलें संकलित करता है।
उदाहरण के लिए iostreams के साथ एक ही "हैलो वर्ल्ड" प्रोग्राम वीसी ++ (स्थिर रूप से जुड़े सीआरटी के साथ) और ~ 470 केबी द्वारा जी ++ द्वारा ~ 100 केबी तक संकलित करता है।

+0

यह अभी भी जीसीसी 7.2.0 के साथ नवीनतम विजुअल स्टूडियो और मिनजीडब्ल्यू डब्ल्यू -64 के साथ सच है (मानक कंपाइलर झंडे के साथ जो सीएमके रिलीज बिल्ड के लिए उपयोग करता है)। – clocktown

1

यह वास्तव में एक तरह से सच :) है कि

तुम्हें पता है, जब हम एटी & टी पर हमारी पहली सी ++ संकलक, थी, मैं संकलित 'नमस्ते विश्व', और सका का एक पहलू है निष्पादन योग्य के आकार पर विश्वास नहीं है। 2.1 एमबी

क्या? खैर, तब से कंपाइलर्स एक लंबा सफर तय कर चुके हैं।

उनके पास है? इसे जी ++ के नवीनतम संस्करण पर आज़माएं - आपको आधा मेगाबाइट से ज्यादा परिवर्तन नहीं मिलेगा।

+1

वास्तव में सहायक नहीं है, लेकिन कुछ हास्य मदद करता है। – Saustin

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