2010-07-03 26 views

उत्तर

31

वे आवश्यक रूप से कहीं भी संग्रहीत नहीं हैं। सबसे सरल मामले में, कंपाइलर फ़ंक्शन कॉल को ठीक उसी तरह संकलित करेगा जैसे लापता तर्क मौजूद थे।

उदाहरण के लिए

,

void f(int a, int b = 5) { 
    cout << a << b << endl; 
} 

f(1); 
f(1, 5); 
f() करने के लिए दो कॉल

संभावना बिल्कुल वैसा ही विधानसभा कोड को संकलित कर रहे हैं। आप ऑब्जेक्ट कोड के लिए असेंबली सूची बनाने के लिए अपने कंपाइलर से पूछकर यह देख सकते हैं।

मेरे संकलक उत्पन्न करता है:

movl $5, 4(%esp) ; f(1) 
    movl $1, (%esp) 
    call __Z1fii 

    movl $5, 4(%esp) ; f(1, 5) 
    movl $1, (%esp) 
    call __Z1fii 

आप देख सकते हैं, उत्पन्न कोड के समान है।

+9

+1 - यही कारण है कि कार्यान्वयन फ़ाइल के बजाय हेडर फ़ाइल में डिफ़ॉल्ट तर्क निर्दिष्ट किए गए हैं। –

+0

+1 मैंने कभी इस बारे में गहराई से सोचा नहीं, लेकिन आपका जवाब सही समझ में आता है! यह चीजों को काफी सरल बनाता है; जब मैंने सी ++ का उपयोग करना शुरू किया, तो मुझे आश्चर्य हुआ कि डिफ़ॉल्ट पैरामीटर मान होने पर वर्चुअल फ़ंक्शन को ओवरराइड किया जा सकता है। मैं सोच रहा था कि डिफ़ॉल्ट मानों ने हस्ताक्षर को किसी भी तरह संशोधित किया है या अधिक फ़ंक्शंस उत्पन्न किए हैं, लेकिन कॉल साइट पर केवल उससे निपटने (फ़ंक्शन में कुछ भी नहीं कर रहा है) सबसे अधिक समझ में आता है। – stinky472

+2

@ स्टिंकी: इसका मतलब यह भी है कि यदि डिफ़ॉल्ट मान बदलते हैं तो ग्राहकों को पुन: संकलित करना पड़ता है ... – fredoverflow

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