वह क्या कह रहा है (मुझे लगता है) यह है कि add
फ़ंक्शन इनलाइन नहीं हो रहा है। दूसरे शब्दों में, संकलक do_op
इस तरह इनलाइन सकता है:
int c = func_ptr(4, 5);
लेकिन यह भी add
इस तरह अनुरूप नहीं होगा:
int c = 4 + 5;
हालांकि, वह यह है कि सरल उदाहरण में गलत हो सकता है।
आम तौर पर, जब आप किसी सूचक के माध्यम से फ़ंक्शन को कॉल करते हैं, तो संकलक (संकलन-समय पर) नहीं जानता कि आप किस फ़ंक्शन को कॉल करेंगे, इसलिए यह फ़ंक्शन को इनलाइन नहीं कर सकता है। उदाहरण:
void f1() { ... }
void f2() { ... }
void callThroughPointer() {
int i = arc4random_uniform(2);
void (*f)() = i ? f2 : f1;
f();
}
यहाँ, संकलक पता नहीं कर सकते हैं कि callThroughPointer
f1
या f2
फोन करेगा, इसलिए यह इनलाइन करने के लिए या तो f1
या callThroughPointer
में f2
के लिए कोई रास्ता नहीं है।
हालांकि, अगर संकलक संकलन समय क्या फ़ंक्शन कॉल किया जाएगा पर साबित कर सकते हैं, यह समारोह इनलाइन करने के लिए अनुमति दी है। उदाहरण:
void f1() { ... }
void f2() { ... }
void callThroughPointer2() {
int i = arc4random_uniform(2);
void (*f)() = i ? f2 : f1;
f = f1;
f();
}
यहाँ, संकलक साबित कर सकते हैं कि f
हमेशा f1
हो जाएगा, तो यह callThroughPointer2
में f1
इनलाइन करने की अनुमति दी है। (यह मतलब नहीं है यह होगा इनलाइन f1
...)
इसी तरह, उदाहरण आप अपनी पोस्ट में उद्धृत में, संकलक साबित कर सकते हैं कि func_ptr
do_op
करने के लिए कॉल में हमेशा add
है, इसलिए यह add
इनलाइन करने की अनुमति दी है । (यह मतलब नहीं है यह होगा इनलाइन add
...)
स्रोत
2012-12-02 23:11:45
ऐसा कोई कारण नहीं है कि यह नहीं हो सका, लेकिन इसके कई कारण हैं कि ऐसा करने का प्रयास क्यों नहीं किया जा सकता है। अगर मुझे गलत जानकारी नहीं दी गई है तो सी (और सी ++) कंपाइलर्स ने हाल ही में जब तक इनलाइनिंग के उद्देश्य के लिए फ़ंक्शन पॉइंटर्स को ट्रैक करने का प्रयास नहीं किया था। –
@ कोनराड रुडॉल्फ - निश्चित रूप से, लेकिन दावा यह है कि ** यह स्पष्ट है कि यह रेखांकित नहीं हो रहा है **। यह बिल्कुल स्पष्ट नहीं है। –