2016-06-05 18 views
24

जंग एक "इनलाइन" विशेषता है कि उन तीन जायके में से एक में इस्तेमाल किया जा सकता है?जंग में इनलाइन का उपयोग कब किया जाना चाहिए?</p> <p><code>#[inline]</code></p> <p><code>#[inline(always)]</code></p> <p><code>#[inline(never)]</code></p> <p>जब वे इस्तेमाल किया जाना चाहिए:

जंग संदर्भ में, हम कह

संकलक स्वचालित रूप से आंतरिक heuristics के आधार पर काम करता है inlines an inline attributes section देखते हैं। गलत रूप से इनलाइनिंग फ़ंक्शंस वास्तव में प्रोग्राम को धीमा कर सकता है, इसलिए इसे देखभाल के साथ उपयोग किया जाना चाहिए।

जंग आंतरिक मंच में, huon भी conservative about specifying inline था।

लेकिन हम मानक पुस्तकालय समेत जंग स्रोत में considerable usage देखते हैं। कई इनलाइन विशेषताओं को एक-पंक्ति-कार्यों में जोड़ा जाता है, जो संदर्भ के अनुसार कंप्यूटर्स को स्पॉट और हेरिस्टिक के माध्यम से ऑप्टिमाइज़ करना आसान होना चाहिए। क्या वास्तव में उनको जरूरी नहीं है? वर्तमान जंग संकलक की

उत्तर

27

एक सीमा यह है कि यदि आप LTO (लिंक समय अनुकूलन) उपयोग नहीं कर रहे हैं, यह चिह्नित नहीं #[inline] क्रेट भर में एक समारोह इनलाइन कभी नहीं होगा है। जंग सी ++ के समान एक अलग संकलन मॉडल का उपयोग करता है क्योंकि एलएलवीएम का एलटीओ कार्यान्वयन बड़ी परियोजनाओं के लिए अच्छी तरह से स्केल नहीं करता है। इसलिए, अन्य crates के संपर्क में छोटे कार्यों हाथ से चिह्नित करने की जरूरत है। यह एक अच्छी स्थिति नहीं है, और एलटीओ और एमआईआर इनलाइनिंग में सुधार के कुछ संयोजनों से भविष्य में इसे ठीक होने की संभावना है।

#[inline(never)] कभी-कभी डीबगिंग के लिए उपयोगी होता है (कोड के एक टुकड़े को अलग करना जो अपेक्षा के अनुरूप काम नहीं कर रहा है)। सिद्धांत रूप में, इसका उपयोग बेंचमार्किंग के लिए किया जा सकता है, लेकिन यह आमतौर पर एक बुरा विचार है: इनलाइनिंग को बंद करने से निरंतर प्रचार जैसे अन्य अंतर-प्रक्रियात्मक अनुकूलन को रोका नहीं जाता है। सामान्य कोड के संदर्भ में, यदि आपके पास अक्सर उपयोग किए जाने वाले सहायक फ़ंक्शन का उपयोग किया जाता है, तो यह कोड को कम कर सकता है जिसका उपयोग केवल त्रुटि प्रबंधन के लिए किया जाता है।

#[inline(always)] आम तौर पर बुरा विचार है, यदि कोई फ़ंक्शन इतना बड़ा है कि संकलक डिफ़ॉल्ट रूप से इसे रेखांकित नहीं करेगा, तो यह इतना बड़ा है कि कॉल का ओवरहेड कोई फर्क नहीं पड़ता (और अत्यधिक इनलाइनिंग निर्देश कैश दबाव बढ़ाता है)। अपवाद हैं, लेकिन आपको इसे उचित ठहराने के लिए प्रदर्शन माप की आवश्यकता है। https://github.com/rust-lang/rust/commit/274bb24efdbeed0ab1a91f3c02f86551ef16eac7 ऐसी स्थिति है जहां यह विचार करने योग्य है। #[inline(always)] का उपयोग भी -ओ0 कोड गुणवत्ता में सुधार के लिए किया जा सकता है, लेकिन यह आमतौर पर चिंता करने योग्य नहीं है।

+5

ध्यान दें कि 'इनलाइन (कभी नहीं)' आतंक intrinsics पर प्रयोग किया जाता है यह सुनिश्चित करें कि अनुकूलक इनलाइन कार्यों कि केवल आतंक के मामले में कहा जाता है नहीं है बनाने के लिए। –

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