উত্তর:
inline
সংকলককে প্রকৃত কল কার্যকর করার পরিবর্তে ফাংশন সামগ্রীটি কলিং কোডে এম্বেড করার চেষ্টা করার নির্দেশ দেয় ।
ছোট ক্রিয়াকলাপগুলির জন্য যা ঘন ঘন বলা হয় যা একটি বড় পারফরম্যান্সের পার্থক্য করতে পারে।
তবে এটি কেবল একটি "ইঙ্গিত", এবং সংকলক এটিকে উপেক্ষা করতে পারে এবং বেশিরভাগ সংকলকরা কী কীওয়ার্ডটি ব্যবহার না করা হলেও "ইনলাইন" করার চেষ্টা করবে, যেখানে এটি সম্ভব হয়েছিল of
উদাহরণ স্বরূপ:
static int Inc(int i) {return i+1};
.... // some code
int i;
.... // some more code
for (i=0; i<999999; i = Inc(i)) {/*do something here*/};
এই টাইট লুপটি প্রতিটি পুনরাবৃত্তির জন্য একটি ফাংশন কল করবে এবং ফাংশন সামগ্রীটি কলটি সঞ্চালনের জন্য সংস্থাপকটির যে কোডটি লাগাতে হবে তার চেয়ে অনেক কম। inline
উপরের কোডটি একটি সমতুল্যে রূপান্তর করতে মূলত সংকলককে নির্দেশ করবে:
int i;
....
for (i=0; i<999999; i = i+1) { /* do something here */};
আসল ফাংশন কল এড়িয়ে যাওয়া এবং ফিরে আসা
স্পষ্টতই এটি পয়েন্টটি দেখানোর উদাহরণ, কোডের আসল অংশ নয়।
static
সুযোগ বোঝায়। সিতে এর অর্থ হ'ল ফাংশন / ভেরিয়েবল কেবল একই অনুবাদ ইউনিটের মধ্যেই ব্যবহার করা যায়।
static
(সাথে বা বাইরে inline
) পুরোপুরি ভালভাবে শিরোনামে থাকতে পারে, না করার কারণ দেখুন না। টেমপ্লেটগুলি সি ++ এর জন্য, এই প্রশ্নটি সি সম্পর্কে
inline
করা ভাল স্টাইল, ইমো
inline
দেয় না । এটি কেবল প্রোগ্রামারকে ওডিআর লঙ্ঘন ছাড়াই একাধিক অনুবাদ ইউনিটে ফাংশন বডি অন্তর্ভুক্ত করতে দেয়। এর একটি পার্শ্ব প্রতিক্রিয়া হ'ল এটি কম্পাইলারের পক্ষে যখন এটি ফাংশনটি ইনলাইন করবে তখন এটি এটি করা সম্ভব করে তোলে ।
ডিফল্টরূপে, একটি ইনলাইন সংজ্ঞা কেবলমাত্র বর্তমান অনুবাদ ইউনিটে বৈধ।
স্টোরেজ ক্লাসটি থাকলে extern
সনাক্তকারীটির বাহ্যিক সংযোগ রয়েছে এবং ইনলাইন সংজ্ঞাটি বাহ্যিক সংজ্ঞাও সরবরাহ করে।
স্টোরেজ ক্লাসটি থাকলে static
সনাক্তকারীটির অভ্যন্তরীণ সংযোগ রয়েছে এবং অন্যান্য অনুবাদ ইউনিটে ইনলাইন সংজ্ঞাটি অদৃশ্য।
যদি স্টোরেজ ক্লাসটি অনির্ধারিত থাকে তবে ইনলাইন সংজ্ঞাটি কেবলমাত্র বর্তমান অনুবাদ ইউনিটে দৃশ্যমান, তবে সনাক্তকারীটির এখনও বাহ্যিক সংযোগ রয়েছে এবং একটি বাহ্যিক সংজ্ঞা অবশ্যই আলাদা অনুবাদ ইউনিটে সরবরাহ করতে হবে। বর্তমান অনুবাদ ইউনিটের মধ্যে যদি ফাংশনটি ডাকা হয় তবে সংকলক ইনলাইন বা বাহ্যিক সংজ্ঞা ব্যবহার করতে পারে is
সংকলক যেহেতু সংজ্ঞাটি বর্তমান অনুবাদ ইউনিটে দৃশ্যমান (এবং লিঙ্ক-টাইম অপ্টিমাইজেশনের জন্য ধন্যবাদ, এমনকি বিভিন্ন অনুবাদ ইউনিটেও) ইনলাইন (এবং ইনলাইন না করার জন্য) মুক্ত, যদিও সি স্ট্যান্ডার্ডটি সত্যিকার অর্থে অ্যাকাউন্ট না যে), বেশিরভাগ ব্যবহারিক উদ্দেশ্যে, ফাংশন সংজ্ঞা static
এবং ব্যবস্থার মধ্যে কোনও পার্থক্য নেই static inline
।
inline
সুনির্দিষ্টভাবে উল্লেখ করা (যেমন register
স্টোরেজ বর্গ) শুধুমাত্র একটি কম্পাইলার ইঙ্গিতটি, এবং কম্পাইলার সম্পূর্ণরূপে তা উপেক্ষা করা হয় বিনামূল্যে। স্ট্যান্ডার্ডস-কমপ্লায়েন্ট অ-অপ্টিমাইজ করা সংকলকগুলিকে কেবল তাদের পার্শ্ব-প্রতিক্রিয়া সম্মান করতে হবে, এবং সংকলকগুলি অনুকূলকরণগুলি সুস্পষ্ট ইঙ্গিত সহ বা ছাড়াই এই অপটিমাইজেশনটি করবে।
inline
এবং register
অকেজো নয়, যদিও তারা সংকলককে ত্রুটি নিক্ষেপ করার নির্দেশ দেয় যখন প্রোগ্রামার কোডটি লিখেন যা অপ্টিমাইজেশনকে অসম্ভব করে তুলবে: একটি বাহ্যিক inline
সংজ্ঞা অভ্যন্তরীণ লিঙ্কেজ সহ সনাক্তকারীদের রেফারেন্স করতে পারে না (কারণ এটি কোনও ভিন্ন অনুবাদ ইউনিটে অনুপলব্ধ থাকবে) বা স্থিতিশীল স্টোরেজ সময়কালের সাথে সংশোধনযোগ্য স্থানীয় ভেরিয়েবলগুলি সংজ্ঞায়িত করুন (কারণ এগুলি রাষ্ট্রীয় অনুবাদ ইউনিটগুলিতে ভাগ করে না) এবং আপনি register
যোগ্যতাযুক্ত ভেরিয়েবলগুলির ঠিকানা নিতে পারবেন না ।
ব্যক্তিগতভাবে, আমি static
শিরোনামের মধ্যেও ফাংশন সংজ্ঞা চিহ্নিত করতে কনভেনশনটি ব্যবহার করি inline
, কারণ হেডার ফাইলগুলিতে ফাংশন সংজ্ঞা স্থাপনের মূল কারণ হ'ল তাদের অবিচ্ছিন্ন করে তোলা।
সাধারণভাবে, আমি ছাড়াও কেবল static inline
ফাংশন এবং static const
অবজেক্টের সংজ্ঞা ব্যবহার করিextern
শিরোনামের মধ্যে ঘোষণার ।
আমি কখনও inline
স্টোরেজ ক্লাসের সাথে কোনও ফাংশন লিখিনি static
।
inline
মতো এটি যদি প্রকৃতপক্ষে ইনলাইনিংয়ের ক্ষেত্রে প্রয়োগ হয় তা বিভ্রান্তিমূলক এবং তর্কযোগ্যভাবে ভুল। কোনও আধুনিক সংকলক কোনও ক্রিয়াকলাপের ইনলাইনিং সক্ষম করার জন্য এটি ইনলাইন করার প্রয়োজন বা এটির প্রয়োজন হিসাবে ইঙ্গিত হিসাবে ব্যবহার করে না।
static
এবং static inline
। উভয়ই সংজ্ঞাটি অন্য অনুবাদ ইউনিটের কাছে অদৃশ্য করে তোলে। তাহলে এর static inline
পরিবর্তে লেখার বুদ্ধিমান কারণ কী হবে static
?
জিসিসির সাথে আমার অভিজ্ঞতা থেকে আমি তা জানি static
এবং static inline
কম্পাইলার কীভাবে অব্যবহৃত ফাংশন সম্পর্কে সতর্কতা জারি করে তা একরকমভাবে পৃথক। আরও স্পষ্টভাবে যখন আপনি static
ফাংশন ঘোষণা করেন এবং এটি বর্তমান অনুবাদ ইউনিটে ব্যবহৃত হয় না তখন অপ্রয়োজনীয় ফাংশন সম্পর্কে সতর্কতা তৈরি করে কম্পাইলার, তবে আপনি সেই সতর্কতাটিকে এতে পরিবর্তন করে বাধা দিতে পারেনstatic inline
।
সুতরাং আমি ভাবতে চাই যে static
অনুবাদ ইউনিটগুলিতে ব্যবহার করা উচিত এবং অতিরিক্ত চেক সংকলক থেকে অব্যবহৃত ফাংশনগুলি সন্ধান করতে পারে। এবং static inline
সতর্কতা জারি না করে ইন-রেখাযুক্ত (বাহ্যিক সংযোগ না থাকার কারণে) ফাংশন সরবরাহ করতে হেডার ফাইলগুলিতে ব্যবহার করা উচিত।
দুর্ভাগ্যক্রমে আমি এই যুক্তির কোনও প্রমাণ পাই না। এমনকি জিসিসি ডকুমেন্টেশন থেকেও আমি এই সিদ্ধান্তে পৌঁছাতে পারিনি যে inline
অব্যবহৃত ফাংশন সতর্কতাগুলিকে বাধা দেয়। কেউ যদি এর বর্ণনার সাথে লিঙ্কগুলি ভাগ করে দেয় তবে আমি প্রশংসা করব।
warning: unused function 'function' [clang-diagnostic-unused-function]
একটি static inline
ফাংশন পেয়েছি clang-tidy
যা অন্য অনুবাদ ইউনিটে ব্যবহৃত হয়। তবে অবশ্যই, static
& একত্রিত করার জন্য এটি অন্যতম সেরা ব্যাখ্যা এবং কারণ inline
!
সি তে, static
আপনি যে ফাংশন বা ভেরিয়েবলটি নির্ধারণ করেছেন তার অর্থ কেবল এই ফাইলে ব্যবহার করা যেতে পারে (যেমনটি সংকলন ইউনিট)
সুতরাং, static inline
ইনলাইন ফাংশনটি যা কেবলমাত্র এই ফাইলটিতে ব্যবহার করা যেতে পারে means
সম্পাদনা করুন:
সংকলন ইউনিটটি অনুবাদ ইউনিট হওয়া উচিত
the compile unit
এমন কিছু যা আমি ভুল করে লিখেছি, এরকম কোনও কিছুই নেই, আসল পরিভাষাটি হ'লtranslation unit
একটি পার্থক্য যা ভাষা স্তরে নয় তবে জনপ্রিয় বাস্তবায়ন স্তরে: সিসির কয়েকটি সংস্করণ static inline
ডিফল্টরূপে আউটপুট থেকে অবাস্তব ফাংশনগুলি সরিয়ে দেবে , তবে static
অবাস্তবহীন হলেও প্লেইন ফাংশনগুলি রাখবে । আমি নিশ্চিত নই যে এটি কোন সংস্করণে প্রযোজ্য, তবে ব্যবহারিক দৃষ্টিকোণ থেকে এর অর্থ হ'ল শিরোনামে ফাংশনগুলির inline
জন্য সর্বদা ব্যবহার করা ভাল ধারণা হতে পারে static
।
inline
সংজ্ঞা ব্যবহার সম্পর্কে কি ? আপনি কি এটি বোঝায় যে এটি extern
ফাংশনগুলির জন্য ব্যবহার করছেন না ?
attribute((used))
এবং এর ব্যবহারটি এএসএমকে অন্যথায়-অনর্থনিত static
ফাংশন এবং ডেটা উল্লেখ করার অনুমতি দেয় সেটির ব্যবহার দেখে অনুকূলিতকরণ শুরু করে।
static
সুযোগটি বোঝায়। সিতে এর অর্থ হ'ল ফাংশন / ভেরিয়েবল কেবল একই অনুবাদ ইউনিটের মধ্যেই ব্যবহার করা যায়।