2012-04-21 12 views
17

NS_INLINE की परिभाषा को देखते हुए ऐसा लगता है कि static inline पर इसका उपयोग करने का लाभ संकलक संगतता है, क्या यह सही है? NS_INLINE हमेशा उद्देश्य-सी परियोजनाओं में सी कार्यों पर static inline के बजाय उपयोग किया जाना चाहिए?स्थिर इनलाइन पर NS_INLINE का क्या फायदा है?

#if !defined(NS_INLINE) 
    #if defined(__GNUC__) 
     #define NS_INLINE static __inline__ __attribute__((always_inline)) 
    #elif defined(__MWERKS__) || defined(__cplusplus) 
     #define NS_INLINE static inline 
    #elif defined(_MSC_VER) 
     #define NS_INLINE static __inline 
    #elif TARGET_OS_WIN32 
     #define NS_INLINE static __inline__ 
    #endif 
#endif 

उत्तर

10

हां, यह कंपाइलर संगतता के लिए है, लेकिन मुझे लगता है कि यह आपके कोड के मुकाबले ढांचे के उपयोग के लिए अधिक है। आप इसका उपयोग करने के लिए स्वतंत्र हैं, ज़ाहिर है, लेकिन मैं परेशान नहीं होगा।

+0

यदि कोड अन्य लोगों द्वारा उपयोग की जाने वाली लाइब्रेरी के लिए है, तो क्या आप 'NS_INLINE' का उपयोग करने की सलाह देंगे? – keegan3d

+3

क्या यह एप्पल के अलावा प्लेटफ़ॉर्म पर उपयोग किया जा रहा है? GnuStep या पसंद के साथ? यदि नहीं, तो नहीं। लगभग शून्य मौका है कि मैक ओएस एक्स या आईओएस के लिए विकास करना कभी भी 'स्थिर इनलाइन' के साथ असंगत होगा। –

21

NS_INLINE की परिभाषा को देखते हुए ऐसा लगता है कि स्थिर इनलाइन पर इसका उपयोग करने का लाभ संकलक संगतता है, क्या यह सही है?

केवल कुछ हिस्सों में। आपको यहां प्रमुख टूलचेन का आकलन करना होगा, और पूछें "क्यों static inline उपयोग नहीं किया गया था, या यह अपर्याप्त क्यों था?"। प्रमुख टूलचेन में विशेषता __attribute__((always_inline)) है। तो इसमें वास्तव में दो भाग हैं:

  • ए) संगतता तो यह एकाधिक कंपाइलरों के लिए संगतता जोड़ता है।

  • बी) प्रभावी टूलचेन में __attribute__((always_inline)) का उपयोग करें। inlineinline पर एक सरल अनुरोध के लिए तैयार किया गया है। always_inline के साथ, कंपाइलर अभी भी फ़ंक्शन को इनलाइन करने का अधिकार सुरक्षित रख सकता है (स्पष्ट कारणों से)। हालांकि, यह भी कहता है "मेरा विश्वास करो, मुझे यह रेखांकित करना चाहिए - कंपाइलर, यदि संभव हो तो इनलाइन करें"। यह विशेषता प्रोग्रामर को इनलाइन करने की कुछ क्षमता को पुनर्स्थापित करती है। इसका प्रदर्शन प्रदर्शन के लिए किया जा सकता है, लेकिन मुझे संदेह है (इस मामले में) कि प्रदर्शन आवश्यकताओं के बजाए निजी निर्यात किए गए कार्यों की संख्या में कमी के साथ इसे और अधिक करना है।

हमेशा उद्देश्य-सी परियोजनाओं में स्थिर इनलाइन के स्थान पर किया NS_INLINE चाहिए?

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

+0

धन्यवाद, बहुत गहराई से! मैंने अपने प्रश्न स्लॉट्स को यह स्पष्ट करने के लिए अद्यतन किया है कि मैं एक उद्देश्य-सी परियोजना में सी कार्यों के बारे में बात कर रहा हूं। – keegan3d

+3

@ keegan3d आपका स्वागत है। वास्तव में, मुझे लगता है कि आप इसे सही प्रतीकों पर लागू कर रहे थे। मैंने ओबीजेसी विधियों का एक साइड नोट के रूप में उल्लेख किया (उदाहरण के लिए किसी भी पाठक के लिए)। हालांकि, बड़ा मुद्दा यह था कि मैं * कोशिश कर रहा था * टूलचैन में अच्छे अनुकूलक थे, और अनुकूलन में काफी हालिया प्रगति (जैसे क्लैंग के एलटीओ) जो कई सी और सी ++ प्रतीकों के बहुत आक्रामक अनुकूलन की अनुमति देते हैं - भले ही परिभाषा संकलक के लिए दृश्यमान नहीं हैं।ये प्रगति सफलतापूर्वक हाथ ट्यूनिंग की कठिनाई में वृद्धि करती है (उदाहरण के लिए '__attribute __ ((always_inline)) का उपयोग')। – justin

+0

नए 'FOUNDATION_STATIC_INLINE' मैक्रो के बारे में क्या? इसे अभी 'स्थिर __inline__' के रूप में परिभाषित किया गया है। क्या मैं इसका उपयोग कर सकता हूं, यानी 'स्थैतिक __inline__'' स्थिर इनलाइन 'जैसा ही है? – ma11hew28

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