यह संकलक और अनुकूलन स्तर पर निर्भर करता है। GCC के नवीनतम संस्करणों की, कुछ सामान्य सिस्टम पर, कुछ अनुकूलन के साथ, इस तरह के एक अनुकूलन
आप जब संकलन चेतावनी सक्षम होना चाहिए ((puts
के साथ एक सरल printf
, जो AFAIU C99 की तरह कानूनी wrt मानकों है की जगह) कर पा रहे हैं जैसे gcc -Wall -g
साथ संकलित करने के लिए पहली कोशिश है, तो gdb
साथ डिबग, तो जब आप अपने कोड के साथ विश्वास है gcc -Wall -O2
साथ यह संकलन)
Btw, फिर से परिभाषित करने puts
वास्तव में बहुत बदसूरत है, जब तक आप उद्देश्य पर यह कर (यानी कोडिंग कर रहे हैं अपने अपनी सी पुस्तकालय, और फिर आपको मानकों का पालन करना होगा)। आपको कुछ undefined behavior मिल रहे हैं (यूबी के संभावित परिणामों के बारे में this answer भी देखें)। असल में आपको मानक में उल्लिखित नामों को फिर से परिभाषित करने से बचना चाहिए, जब तक कि आप वास्तव में वास्तव में अच्छी तरह से नहीं जानते कि आप क्या कर रहे हैं और कंपाइलर के अंदर क्या हो रहा है।
इसके अलावा, यदि आप gcc -Wall -static -O main.c -o yourprog
जैसे स्थिर लिंकिंग के साथ संकलित हैं तो मैं शर्त लगाऊंगा कि लिंकर शिकायत करेगा (puts
की एकाधिक परिभाषा के बारे में)।
लेकिन IMNSHO अपने कोड सादा गलत है, और आपको लगता है कि पता है।
इसके अलावा, आप, उदाहरण के लिए कोडांतरक प्राप्त करने के लिए संकलन कर सकता है gcc -fverbose-asm -O -S
के साथ; और तुम भी gcc
पूछना gcc -fdump-tree-all -O
जो आप समझ gcc
कर रहा है मदद कर सकता है के साथ एक बहुत "डंप" फ़ाइलों की गिर करने के लिए, हो सकता है। , किसी भी libc की printf
नियमित क्रम प्रिंट प्रारूप स्ट्रिंग (निपटने %s
आदि ... विशेष रूप से) पर "की व्याख्या करने के लिए" है:
फिर, यह विशेष रूप से अनुकूलन वैध और बहुत उपयोगी है यह अभ्यास में काफी धीमी है। एक अच्छा कंपाइलर printf
(और puts
के साथ प्रतिस्थापित) को कॉल करने से बचने में सही है।
BTW gcc
केवल कि अनुकूलन कर संकलक नहीं है। clang
भी यह करता है।
इसके अलावा, अगर आप
gcc -ffreestanding -O2 almo.c -o almo
साथ संकलन almo
कार्यक्रम Hello world.
से पता चलता है आप एक और कल्पना और आश्चर्य की बात अनुकूलन चाहते हैं, gcc -O2 -fverbose-asm -S bas.c
साथ
// file bas.c
#include <stdlib.h>
int f (int x, int y) {
int r;
int* p = malloc(2*sizeof(int));
p[0] = x;
p[1] = y;
r = p[0]+p[1];
free (p);
return r;
}
संकलन करने की कोशिश फिरमें देखें; आपको malloc
या free
पर कोई कॉल नहीं दिखाई देगा (वास्तव में, call
मशीन निर्देश उत्सर्जित है) और फिर, gcc
अनुकूलित करने के लिए सही है (और clang
भी करता है)!
पीएस: जीएनयू/लिनक्स/डेबियन/सिड/x86-64; gcc
, संस्करण 4.9.1 है clang
संस्करण 3.4.2
यह अनुकूलन कि जीसीसी के अनुकूलन विकल्प पर निर्भर नहीं करता है पर निर्भर करता है। – BLUEPIXY
प्रश्न को 'c' के रूप में टैग किया गया है, हालांकि संकलक आमंत्रण से पता चलता है कि कोड को C++ के रूप में संकलित किया गया है। –
हां, जीसीसी 'printf() 'से' puts()' तक एक साधारण निरंतर स्ट्रिंग प्रिंट को अनुकूलित कर सकता है, जैसा कि बाद में बेहतर प्रदर्शन करता है ... चूंकि आपने मानक लाइब्रेरी को स्थानीय प्रतीक के साथ बदल दिया है, इसलिए आप यही हैं प्राप्त। यदि आप -ओ 2 के बजाय -O0 का उपयोग करते हैं, तो आपको वास्तव में 'printf() ' – JohnH