2016-10-27 5 views
6

मान लीजिए मैं इस कोडक्या यह इनलाइन फ़ंक्शंस का वैध उपयोग है?

inline float SecondsToMinutes(float seconds) 
{ 
    return seconds/60.0; 
} 
inline float MinutesToHours(float minutes) 
{ 
    return minutes/60.0; 
} 
inline float HoursToDays(float minutes) 
{ 
    return minutes/24.0; 
} 
inline float SeconndsToHours(float seconds) 
{ 
    return MinutesToHours(SecondsToMinutes(seconds)); 
} 
inline float MinutesToDays(float minutes) 
{ 
    return HoursToDays(MinutesToHours(minutes)); 
} 
inline float SeconndsDays(float seconds) 
{ 
    return MinutesToDays(SecondsToMinutes(seconds)); 
} 

इनलाइन के इस वैध उपयोग है (तथ्य यह है कि SecondsToMinutes और MinutesToHours एक दूसरे के कार्बन प्रतियां हैं कोई आपत्ति नहीं है) है? क्या इस का कोई मतलब निकलता है? क्या यह अच्छा अभ्यास है? सब के बाद, अगर मैं सही ढंग से याद करते हैं, इनलाइन मतलब यह है कि फ़ंक्शन कॉल समारोह निकायों द्वारा बदल दिया जाता है, तो

return MinutesToDays(SecondsToMinutes(seconds)) 

return seconds/60.0/60.0/24.0 

अधिकार के बराबर होना चाहिए?

या इसके लिए मैक्रोज़ का उपयोग करना बेहतर है?

#define EXCHANGE_SEC_MIN(x) (x/60.0) 
#define EXCHANGE_MIN_H(x) (x/60.0) 
#define EXCHANGE_H_D(x) (x/24.0) 
#define EXCHANGE_SEC_H(x) (EXCHANGE_MIN_H(EXCHANGE_SEC_MIN(x))) 
#define EXCHANGE_MIN_D(x) (EXCHANGE_H_D(EXCHANGE_MIN_H(x))) 
#define EXCHANGE_SEC_D(x) (EXCHANGE_MIN_D(EXCHANGE_SEC_MIN(x))) 

कौन सा बेहतर अभ्यास है? या न तो है? मैं इस पर दूसरों को सेंट चाहता हूँ।

+7

मैक्रो लगभग हमेशा * * गलत तरीके से :-) – paxdiablo

+2

इसके अलावा आपके मैक्रोज़ गलत हैं: यदि आप इसे 'EXCHANGE_SEC_MIN (ए + बी)' जैसे उपयोग करते हैं तो क्या होता है? – mch

+0

* मैक्रो लगभग हमेशा गलत तरीके से कर रहे हैं * दूसरे शब्दों में अगर कोई मैक्रो के लिए एक सरल विकल्प (जो इस मामले में, एक समारोह है कोई फर्क नहीं पड़ता इनलाइन या नहीं) मैक्रो – Leon

उत्तर

6

क्या यह इनलाइन का वैध उपयोग है? क्या इस का कोई मतलब निकलता है?

अच्छा, हाँ लेकिन नहीं।

यह इस बिंदु पर कुछ भी चोट नहीं पहुंचाता है लेकिन ऐसा नहीं करता जो आपको लगता है कि यह करता है।

एक excellent post about inline deft_code में सही ढंग से कहते हैं:

कहा जाता है कि संकलक आपको लगता है कि समारोह inlined जाना चाहिए करने के लिए inline संकेत। यही कारण है कि 1998 में सच हो सकता है, लेकिन एक दशक बाद संकलक ऐसी कोई संकेत की जरूरत है। इसलिए अधिकांश compilers फ्लैट बाहर की अनदेखी 'संकेत' का उल्लेख नहीं है मनुष्य , आम तौर पर गलत कोड के अनुकूलन करने के लिए जब यह आता है कर रहे हैं।

इसलिए, यह किसी को भी चोट नहीं करता है तो आप यह कर, लेकिन यह कोड इनलाइन करने के लिए फिट देखता है मौका अपने संकलक अपने संकेत को सुनेगा व्यावहारिक रूप से 0. है, यह बहुत ही करेंगे।

inline आजकल ज्यादातर लिंकर के लिए उपयोग किया जाता है क्योंकि यह एकाधिक संकलन इकाइयों में कई परिभाषाओं की अनुमति देता है।

आप का उपयोग करना चाहिए आप सुनिश्चित करें कि आपके कोड के रूप में तेजी से संभव के रूप में है बनाना चाहते हैं और आप के लिए सी ++ 11 पहुँच है, तो constexpr:

constexpr float SecondsToMinutes(float seconds) 
{ 
    return seconds/60.0; 
} 
//etc.. 
+0

ध्यान दें कि 'constexpr' अभी भी एक संकेत है। संकलन समय पर इसका मूल्यांकन करने की आवश्यकता नहीं है जब तक कि यह निरंतर अभिव्यक्ति में उपयोग नहीं किया जाता है (उदा। एक टेम्पलेट गैर-प्रकार तर्क)। संकलन समय पर इसका मूल्यांकन नहीं किया जा सकता है यदि उसके तर्क संकलन समय पर ज्ञात नहीं हैं, और सी ++ 98 कंपाइलर संकलन समय पर ज्ञात तर्कों पर निरंतर फोल्डिंग कर सकते हैं। – Oktalist

+0

@ ऑक्टालिस्ट बहुत सच है, हालांकि इस मामले में यह 'इनलाइन' कीवर्ड की तुलना में कंपाइलर द्वारा उपयोग की जाने वाली अधिक संभावना है। –

7

क्या यह इनलाइन का वैध उपयोग है? क्या इस का कोई मतलब निकलता है? क्या यह अच्छा अभ्यास है? आखिरकार, अगर मुझे सही याद आती है, तो इनलाइन का मतलब है कि कॉल फ़ंक्शन बॉडी द्वारा प्रतिस्थापित किए जाते हैं, इसलिए

निश्चित रूप से यह है। आप इसे अधिक सुगम बनाते हैं जो हमेशा अच्छा होता है।

return seconds/60.0/60.0/24.0 

हां यह कैसे निकलता है। या चाहिए। inline सिर्फ एक संकेत है, संकलन सिर्फ अन्यथा निर्णय ले सकता है। लेकिन ऐसे एक लाइनर के लिए, कंपाइलर इसे रेखांकित करेगा।

मैक्रोज़? क्यूं कर? यदि यह कार्यों के साथ किया जा सकता है, मैक्रोज़ का उपयोग क्यों करें?

+0

आपके उत्तर के लिए धन्यवाद :) मैं भविष्य में इनलाइन फ़ंक्शंस का उपयोग करना सुनिश्चित कर दूंगा, अब मुझे पता है कि वे किसके लिए अच्छे हैं। –

+1

'इनलाइन' ऐसे छोटे कार्यों के लिए बहुत उपयोगी हो सकता है, लेकिन बड़े कार्यों पर ऐसा करने पर सावधानी बरतें। कोड ब्लोट खराब है। सावधान! कंपाइलर फ्लोटिंग पॉइंट गणित की वजह से * आपके कोड को एक एकल विभाजन में कम नहीं करेगा! यदि आप संगतता को तोड़ने के बारे में कोई फर्क नहीं पड़ता है, तो ध्वज '-फैस्ट-गणित' सक्षम करें। [Godbolt] (https://godbolt.org/g/7NBXMy) पर और इसके बिना अंतर देखें। – Asu

3

inline का मतलब है कि फ़ंक्शन कॉल फ़ंक्शन निकायों द्वारा प्रतिस्थापित किया जाता है। कम से कम इसका मतलब यह नहीं है कि पिछले पंद्रह-कुछ सालों से: ऑप्टिमाइज़र अब डेवलपर से ऑर्डर लेने से परे हैं, और इनलाइनों को रेखांकित करेंगे कि आपने inline निर्दिष्ट किया है या नहीं।

inline वास्तव में इसका मतलब है "इस समारोह में कई बार परिभाषित किया जा सकता है, और लिंकर यह सुलझा और अंत में अधिक से अधिक एक एकल परिभाषा रखना चाहिए। मैं यह सुनिश्चित करना कि सभी परिभाषाओं समान हैं के लिए जिम्मेदार हूँ"।

तुम सच में, वास्तव में (फोन करने वाले के अंदर समारोह के शरीर की वास्तविक प्रविष्टि) को इनलाइन लागू करने के लिए अपने आप को देखना चाहते हैं, तो आप इस तरह के रूप में __attribute__((always_inline)) संकलक-विशेष विस्तारण का उपयोग करना होगा।

जब आपको हेडर में फ़ंक्शंस परिभाषित किया जाता है तो आपको आमतौर पर inline की आवश्यकता होती है, क्योंकि इस शीर्षलेख को अंततः कई अनुवाद इकाइयों में शामिल किया जाएगा, इस प्रकार परिभाषाओं को डुप्लिकेट किया जाएगा। इस प्रकार, मान लें कि आपका कोड हेडर के अंदर है, यह inline का अच्छा उपयोग है।

0

मानते हैं कि आपके इनलाइन फ़ंक्शंस की परिभाषाएं उपयोग के बिंदु पर कंपाइलर को दिखाई देती हैं (उदाहरण के लिए वे एक हेडर फ़ाइल में हैं जो #include डी प्रत्येक संकलन इकाई में आवश्यक है), तो आपका उपयोग मान्य है।

हालांकि, inline संकलक के लिए केवल एक संकेत है। मानक संकलक को उस संकेत को अनदेखा करने की अनुमति देते हैं, और फ़ंक्शन को इनलाइन नहीं करते हैं। मानदंड जिसके द्वारा संकलक इनलाइन फ़ंक्शंस नहीं करते हैं, अत्यधिक संकलक निर्भर है।

मैक्रोज़ एक विकल्प हैं, लेकिन अन्य चिंताएं हैं ... जिसमें वे प्रोग्राम स्कोप का सम्मान नहीं करते हैं, और जानबूझकर या गलती से मैक्रोज़ लिखना आसान है - जिसके परिणामस्वरूप किसी व्यक्ति की तुलना में अलग व्यवहार हो सकता है। तो इनलाइन कार्यों को अक्सर बेहतर माना जाता है।

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