আমি জানি যে প্রশ্নটি জিসিসি সম্পর্কে, তবে আমি ভেবেছিলাম অন্যান্য সংকলক সংকলকগুলির সম্পর্কেও কিছু তথ্য থাকতে পারে এটি কার্যকর।
noinline
অন্যান্য সংকলকগুলির সাথেও জিসিসির
ফাংশন বৈশিষ্ট্যটি বেশ জনপ্রিয়। এটি অন্ততপক্ষে সমর্থন করে:
- ঝাঁকুনি (সাথে পরীক্ষা করা
__has_attribute(noinline)
)
- ইন্টেল সি / সি ++ সংকলক (তাদের ডকুমেন্টেশন ভয়ানক, তবে আমি নিশ্চিত এটি 16.0+ এ কাজ করে)
- ওরাকল সোলারিস স্টুডিও কমপক্ষে 12.2 এ ফিরে আসুন
- এআরএম সি / সি ++ কমপাইলারটি কমপক্ষে 4.1 এ ফিরে যান
- আইবিএম এক্সএল সি / সি ++ কমপক্ষে 10.1 এ ফিরে আসুন
- টিআই 8.0+ (বা --gcc সহ 7.3+, যা সংজ্ঞায়িত করবে
__TI_GNU_ATTRIBUTE_SUPPORT__
)
অতিরিক্তভাবে, এমএসভিসি __declspec(noinline)
ভিজ্যুয়াল স্টুডিও 7.1 এ ফিরে সমর্থন করে
। ইন্টেল সম্ভবত এটি সমর্থন করে (তারা জিসিসি এবং এমএসভিসি উভয়ের সাথেই সামঞ্জস্যপূর্ণ হওয়ার চেষ্টা করে) তবে আমি এটি যাচাই করতে বিরত হইনি। বাক্য গঠনটি মূলত:
__declspec(noinline)
static void foo(void) { }
PGI 10.2+ (এবং সম্ভবত আরও পুরানো) একটি noinline
প্রগমা সমর্থন করে যা পরবর্তী ফাংশনে প্রযোজ্য:
#pragma noinline
static void foo(void) { }
টিআই 6.0+ একটি FUNC_CANNOT_INLINE
প্রগমা সমর্থন করে
যা (বিরক্তিকরভাবে) সি এবং সি ++ এ আলাদাভাবে কাজ করে। সি ++ তে এটি পিজিআইয়ের মতো:
#pragma FUNC_CANNOT_INLINE;
static void foo(void) { }
সি তে তবে ফাংশনটির নামটি প্রয়োজনীয়:
#pragma FUNC_CANNOT_INLINE(foo);
static void foo(void) { }
ক্র 6.৪++ (এবং সম্ভবত পূর্ববর্তী) একই ধরণের পন্থা গ্রহণ করে, ফাংশনটির নাম প্রয়োজন:
#pragma _CRI inline_never foo
static void foo(void) { }
ওরাকল ডেভেলপার স্টুডিও একটি প্রগমা সমর্থন করে যা ফাংশনটির নাম নেয়, কমপক্ষে ফোর্ট ডেভেলপার to- এ ফিরে যায় তবে নোট করুন যে এটি ঘোষণার পরেও হওয়া দরকার, এমনকি সাম্প্রতিক সংস্করণগুলিতে:
static void foo(void);
#pragma no_inline(foo)
আপনি কতটা উত্সর্গীকৃত তার উপর নির্ভর করে আপনি একটি ম্যাক্রো তৈরি করতে পারেন যা সর্বত্র কাজ করবে তবে আপনার ফাংশনটির নাম এবং তর্ক হিসাবে তদন্তের প্রয়োজন হবে।
যদি ওটিওহ, আপনি এমন কিছু দিয়ে ঠিক আছেন যা বেশিরভাগ মানুষের পক্ষে কাজ করে তবে আপনি এমন কিছু নিয়ে দূরে সরে যেতে পারেন যা কিছুটা নান্দনিকভাবে আনন্দদায়ক এবং নিজেকে পুনরাবৃত্তি করার প্রয়োজন নেই। হেডলির জন্য আমি এটাই গ্রহণ করেছি , যেখানে 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
আপনি যদি হিডলি ব্যবহার করতে না চান (এটি একটি একক পাবলিক ডোমেন / সিসি শিরোলেখ) আপনি খুব বেশি প্রচেষ্টা ছাড়াই সংস্করণ চেকিং ম্যাক্রোগুলিকে রূপান্তর করতে পারেন তবে আমি যে পরিমাণটি দিতে চাই তাতে তার চেয়ে বেশি ☺