मुझे पता है कि सवाल जीसीसी के बारे में है, लेकिन मुझे लगा कि अन्य कंपाइलरों के बारे में भी कुछ जानकारी रखना उपयोगी हो सकता है।
GCC की
noinline
फ़ंक्शन विशेषता अन्य संकलक के साथ-साथ बहुत लोकप्रिय है। यह कम से कम द्वारा समर्थित है:
- क्लैंग (साथ जांचें
__has_attribute(noinline)
)
- इंटेल C / C ++ कंपाइलर (उनका दस्तावेज़ीकरण भयानक है, लेकिन मुझे यकीन है कि यह 16.0+ पर काम करता है)
- ओरेकल सोलारिस स्टूडियो कम से कम 12.2 पर वापस
- ARM C / C ++ कंपाइलर कम से कम 4.1 पर वापस
- IBM XL C / C ++ कम से कम 10.1 पर वापस
- TI 8.0+ (या 7.3+ --gcc के साथ, जो परिभाषित करेगा
__TI_GNU_ATTRIBUTE_SUPPORT__
)
इसके अतिरिक्त, MSVC __declspec(noinline)
विजुअल स्टूडियो 7.1 में वापस सपोर्ट करता है
। इंटेल शायद इसका समर्थन भी करता है (वे जीसीसी और एमएसवीसी दोनों के साथ संगत होने की कोशिश करते हैं), लेकिन मैंने इसे सत्यापित करने की जहमत नहीं उठाई। सिंटैक्स मूल रूप से समान है:
__declspec(noinline)
static void foo(void) { }
PGI 10.2+ (और शायद पुराने) एक प्रण का समर्थन करता है noinline
जो अगले फ़ंक्शन पर लागू होता है:
#pragma noinline
static void foo(void) { }
TI 6.0+ एक ऐसे FUNC_CANNOT_INLINE
प्रज्ञा का समर्थन करता है
जो (गुस्से में) C और C ++ में अलग तरह से काम करता है। C ++ में, यह PGI के समान है:
#pragma FUNC_CANNOT_INLINE;
static void foo(void) { }
C में, हालांकि, फ़ंक्शन नाम आवश्यक है:
#pragma FUNC_CANNOT_INLINE(foo);
static void foo(void) { }
Cray 6.4+ (और संभवतः पहले) एक समान दृष्टिकोण लेता है, जिसमें फ़ंक्शन नाम की आवश्यकता होती है:
#pragma _CRI inline_never foo
static void foo(void) { }
ओरेकल डेवलपर स्टूडियो भी एक प्रज्ञा का समर्थन करता है जो फ़ंक्शन का नाम लेता है , कम से कम Forte डेवलपर 6 पर वापस जा रहा है , लेकिन ध्यान दें कि इसे घोषणा के बाद आने की आवश्यकता है , यहां तक कि हाल के संस्करणों में भी:
static void foo(void);
#pragma no_inline(foo)
आप कितने समर्पित हैं, इसके आधार पर, आप एक ऐसा मैक्रो बना सकते हैं जो हर जगह काम करेगा, लेकिन आपको फ़ंक्शन नाम के साथ-साथ तर्कों के रूप में घोषणा की आवश्यकता होगी।
यदि, OTOH, तो आप कुछ के साथ ठीक हैं जो कि ज्यादातर लोगों के लिए काम करता है, आप कुछ ऐसी चीज़ों से दूर हो सकते हैं जो थोड़ा अधिक सौंदर्यवादी रूप से मनभावन है और खुद को दोहराने की आवश्यकता नहीं है। यही कारण है कि दृष्टिकोण मैं के लिए ले जाया गया है हेडली , जहां के वर्तमान संस्करण
HEDLEY_NEVER_INLINE
की तरह दिखता है:
#if \
HEDLEY_GNUC_HAS_ATTRIBUTE(noinline,4,0,0) || \
HEDLEY_INTEL_VERSION_CHECK(16,0,0) || \
HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
HEDLEY_TI_VERSION_CHECK(8,0,0) || \
(HEDLEY_TI_VERSION_CHECK(7,3,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__))
# define HEDLEY_NEVER_INLINE __attribute__((__noinline__))
#elif HEDLEY_MSVC_VERSION_CHECK(13,10,0)
# define HEDLEY_NEVER_INLINE __declspec(noinline)
#elif HEDLEY_PGI_VERSION_CHECK(10,2,0)
# define HEDLEY_NEVER_INLINE _Pragma("noinline")
#elif HEDLEY_TI_VERSION_CHECK(6,0,0)
# define HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;")
#else
# define HEDLEY_NEVER_INLINE HEDLEY_INLINE
#endif
यदि आप Hedley (यह एक एकल सार्वजनिक डोमेन / CC0 हेडर है) का उपयोग नहीं करना चाहते हैं, तो आप बहुत अधिक प्रयास किए बिना संस्करण की जाँच करने वाले मैक्रोज़ को परिवर्तित कर सकते हैं, लेकिन इससे अधिक मैं ☺ में डालने के लिए तैयार हूं।