"স্ট্যাটিক" এবং "স্ট্যাটিক ইনলাইন" ফাংশনের মধ্যে পার্থক্য কী?


123

আইএমও উভয়ই কেবল অনুবাদ ইউনিটের একটি সুযোগ পেতে ফাংশনটি তৈরি করে।

"স্ট্যাটিক" এবং "স্ট্যাটিক ইনলাইন" ফাংশনের মধ্যে পার্থক্য কী?

inlineফাইলের মধ্যে নয় কেন একটি হেডার ফাইল রাখা উচিত .c?

উত্তর:


109

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সুযোগ বোঝায়। সিতে এর অর্থ হ'ল ফাংশন / ভেরিয়েবল কেবল একই অনুবাদ ইউনিটের মধ্যেই ব্যবহার করা যায়।


4
না, staticসুযোগটি বোঝায়। সিতে এর অর্থ হ'ল ফাংশন / ভেরিয়েবল কেবল একই অনুবাদ ইউনিটের মধ্যেই ব্যবহার করা যায়।
littleadv

8
এটি নোট করাও গুরুত্বপূর্ণ যে ইনলাইন হিসাবে ঘোষিত কোডটি শিরোনামের অন্তর্ভুক্ত, যেখানে সাধারণ (নন-টেম্পলেট) উত্স কোড হিসাবে একাধিক পুনঃনির্ধারণ ত্রুটি না ঘটিয়ে শিরোনামে যেতে পারে না। সুতরাং কোনও ইনলাইন ঘোষণার সময়, যদিও সংকলক এটি ইনলাইন না করা বেছে নেয়, এখনও এমন একটি মান-বাধ্যতামূলক একাধিক-
পুনর্নির্ধারণ রয়েছে

13
@ ভয়েডস্টার আসলে static(সাথে বা বাইরে inline) পুরোপুরি ভালভাবে শিরোনামে থাকতে পারে, না করার কারণ দেখুন না। টেমপ্লেটগুলি সি ++ এর জন্য, এই প্রশ্নটি সি সম্পর্কে
লিটলডিভি

2
@ লিটলএডভিভি: শিরোনাম ফাইলগুলিতে ফাংশন সংজ্ঞা স্থাপনের মূল কারণ হ'ল তাদের অবিচ্ছিন্ন করা, সুতরাং তাদের স্পষ্টভাবে চিহ্নিত inlineকরা ভাল স্টাইল, ইমো
ক্রিস্টোফ

9
প্রকৃতপক্ষে ইনলাইনে কোনও প্রচেষ্টা করার জন্য সংকলককে নির্দেশinline দেয় না । এটি কেবল প্রোগ্রামারকে ওডিআর লঙ্ঘন ছাড়াই একাধিক অনুবাদ ইউনিটে ফাংশন বডি অন্তর্ভুক্ত করতে দেয়। এর একটি পার্শ্ব প্রতিক্রিয়া হ'ল এটি কম্পাইলারের পক্ষে যখন এটি ফাংশনটি ইনলাইন করবে তখন এটি এটি করা সম্ভব করে তোলে ।
রুসলান

96

ডিফল্টরূপে, একটি ইনলাইন সংজ্ঞা কেবলমাত্র বর্তমান অনুবাদ ইউনিটে বৈধ।

স্টোরেজ ক্লাসটি থাকলে externসনাক্তকারীটির বাহ্যিক সংযোগ রয়েছে এবং ইনলাইন সংজ্ঞাটি বাহ্যিক সংজ্ঞাও সরবরাহ করে।

স্টোরেজ ক্লাসটি থাকলে staticসনাক্তকারীটির অভ্যন্তরীণ সংযোগ রয়েছে এবং অন্যান্য অনুবাদ ইউনিটে ইনলাইন সংজ্ঞাটি অদৃশ্য।

যদি স্টোরেজ ক্লাসটি অনির্ধারিত থাকে তবে ইনলাইন সংজ্ঞাটি কেবলমাত্র বর্তমান অনুবাদ ইউনিটে দৃশ্যমান, তবে সনাক্তকারীটির এখনও বাহ্যিক সংযোগ রয়েছে এবং একটি বাহ্যিক সংজ্ঞা অবশ্যই আলাদা অনুবাদ ইউনিটে সরবরাহ করতে হবে। বর্তমান অনুবাদ ইউনিটের মধ্যে যদি ফাংশনটি ডাকা হয় তবে সংকলক ইনলাইন বা বাহ্যিক সংজ্ঞা ব্যবহার করতে পারে is

সংকলক যেহেতু সংজ্ঞাটি বর্তমান অনুবাদ ইউনিটে দৃশ্যমান (এবং লিঙ্ক-টাইম অপ্টিমাইজেশনের জন্য ধন্যবাদ, এমনকি বিভিন্ন অনুবাদ ইউনিটেও) ইনলাইন (এবং ইনলাইন না করার জন্য) মুক্ত, যদিও সি স্ট্যান্ডার্ডটি সত্যিকার অর্থে অ্যাকাউন্ট না যে), বেশিরভাগ ব্যবহারিক উদ্দেশ্যে, ফাংশন সংজ্ঞা staticএবং ব্যবস্থার মধ্যে কোনও পার্থক্য নেই static inline

inlineসুনির্দিষ্টভাবে উল্লেখ করা (যেমন registerস্টোরেজ বর্গ) শুধুমাত্র একটি কম্পাইলার ইঙ্গিতটি, এবং কম্পাইলার সম্পূর্ণরূপে তা উপেক্ষা করা হয় বিনামূল্যে। স্ট্যান্ডার্ডস-কমপ্লায়েন্ট অ-অপ্টিমাইজ করা সংকলকগুলিকে কেবল তাদের পার্শ্ব-প্রতিক্রিয়া সম্মান করতে হবে, এবং সংকলকগুলি অনুকূলকরণগুলি সুস্পষ্ট ইঙ্গিত সহ বা ছাড়াই এই অপটিমাইজেশনটি করবে।

inlineএবং registerঅকেজো নয়, যদিও তারা সংকলককে ত্রুটি নিক্ষেপ করার নির্দেশ দেয় যখন প্রোগ্রামার কোডটি লিখেন যা অপ্টিমাইজেশনকে অসম্ভব করে তুলবে: একটি বাহ্যিক inlineসংজ্ঞা অভ্যন্তরীণ লিঙ্কেজ সহ সনাক্তকারীদের রেফারেন্স করতে পারে না (কারণ এটি কোনও ভিন্ন অনুবাদ ইউনিটে অনুপলব্ধ থাকবে) বা স্থিতিশীল স্টোরেজ সময়কালের সাথে সংশোধনযোগ্য স্থানীয় ভেরিয়েবলগুলি সংজ্ঞায়িত করুন (কারণ এগুলি রাষ্ট্রীয় অনুবাদ ইউনিটগুলিতে ভাগ করে না) এবং আপনি registerযোগ্যতাযুক্ত ভেরিয়েবলগুলির ঠিকানা নিতে পারবেন না ।

ব্যক্তিগতভাবে, আমি staticশিরোনামের মধ্যেও ফাংশন সংজ্ঞা চিহ্নিত করতে কনভেনশনটি ব্যবহার করি inline, কারণ হেডার ফাইলগুলিতে ফাংশন সংজ্ঞা স্থাপনের মূল কারণ হ'ল তাদের অবিচ্ছিন্ন করে তোলা।

সাধারণভাবে, আমি ছাড়াও কেবল static inlineফাংশন এবং static constঅবজেক্টের সংজ্ঞা ব্যবহার করিextern শিরোনামের মধ্যে ঘোষণার ।

আমি কখনও inlineস্টোরেজ ক্লাসের সাথে কোনও ফাংশন লিখিনি static


8
এটা সঠিক উত্তর. যে কোনও উত্তর সম্পর্কে কথা বলার inlineমতো এটি যদি প্রকৃতপক্ষে ইনলাইনিংয়ের ক্ষেত্রে প্রয়োগ হয় তা বিভ্রান্তিমূলক এবং তর্কযোগ্যভাবে ভুল। কোনও আধুনিক সংকলক কোনও ক্রিয়াকলাপের ইনলাইনিং সক্ষম করার জন্য এটি ইনলাইন করার প্রয়োজন বা এটির প্রয়োজন হিসাবে ইঙ্গিত হিসাবে ব্যবহার করে না।
টাইগ 13

1
"শিরোনাম ইনলাইনে স্থির ফাংশন সংজ্ঞা চিহ্নিত করতে কনভেনশনটি ব্যবহার করুন" এর জন্য আপবোটেড।
জন জেড। লি

আমি আপনার সমগ্র উত্তর পড়া এবং আমি এখনও মধ্যে শব্দার্থিক পার্থক্য পাবেন না staticএবং static inline। উভয়ই সংজ্ঞাটি অন্য অনুবাদ ইউনিটের কাছে অদৃশ্য করে তোলে। তাহলে এর static inlineপরিবর্তে লেখার বুদ্ধিমান কারণ কী হবে static?
ব্যবহারকারী 541686

21

জিসিসির সাথে আমার অভিজ্ঞতা থেকে আমি তা জানি staticএবং static inlineকম্পাইলার কীভাবে অব্যবহৃত ফাংশন সম্পর্কে সতর্কতা জারি করে তা একরকমভাবে পৃথক। আরও স্পষ্টভাবে যখন আপনি staticফাংশন ঘোষণা করেন এবং এটি বর্তমান অনুবাদ ইউনিটে ব্যবহৃত হয় না তখন অপ্রয়োজনীয় ফাংশন সম্পর্কে সতর্কতা তৈরি করে কম্পাইলার, তবে আপনি সেই সতর্কতাটিকে এতে পরিবর্তন করে বাধা দিতে পারেনstatic inline

সুতরাং আমি ভাবতে চাই যে staticঅনুবাদ ইউনিটগুলিতে ব্যবহার করা উচিত এবং অতিরিক্ত চেক সংকলক থেকে অব্যবহৃত ফাংশনগুলি সন্ধান করতে পারে। এবং static inlineসতর্কতা জারি না করে ইন-রেখাযুক্ত (বাহ্যিক সংযোগ না থাকার কারণে) ফাংশন সরবরাহ করতে হেডার ফাইলগুলিতে ব্যবহার করা উচিত।

দুর্ভাগ্যক্রমে আমি এই যুক্তির কোনও প্রমাণ পাই না। এমনকি জিসিসি ডকুমেন্টেশন থেকেও আমি এই সিদ্ধান্তে পৌঁছাতে পারিনি যে inlineঅব্যবহৃত ফাংশন সতর্কতাগুলিকে বাধা দেয়। কেউ যদি এর বর্ণনার সাথে লিঙ্কগুলি ভাগ করে দেয় তবে আমি প্রশংসা করব।


1
মিমি, (v8.0.1) দিয়ে বিল্ড করার সময় এখনও warning: unused function 'function' [clang-diagnostic-unused-function]একটি static inlineফাংশন পেয়েছি clang-tidyযা অন্য অনুবাদ ইউনিটে ব্যবহৃত হয়। তবে অবশ্যই, static& একত্রিত করার জন্য এটি অন্যতম সেরা ব্যাখ্যা এবং কারণ inline!
ড্রামএম

6

সি তে, static আপনি যে ফাংশন বা ভেরিয়েবলটি নির্ধারণ করেছেন তার অর্থ কেবল এই ফাইলে ব্যবহার করা যেতে পারে (যেমনটি সংকলন ইউনিট)

সুতরাং, static inline ইনলাইন ফাংশনটি যা কেবলমাত্র এই ফাইলটিতে ব্যবহার করা যেতে পারে means

সম্পাদনা করুন:

সংকলন ইউনিটটি অনুবাদ ইউনিট হওয়া উচিত


2
বা অভিনব কথায়: এটির অভ্যন্তরীণ সংযোগ রয়েছে।
কে-বালো

@ অলোকস্যাভ: সংকলন ইউনিট এবং অনুবাদ ইউনিটের মধ্যে কি পার্থক্য রয়েছে ? যদি তা হয় তবে সি ++ ভাষার প্রেক্ষাপটে কোনটি বেশি উপযুক্ত?
কিংবদন্তি

আমি বিশ্বাস করি the compile unitএমন কিছু যা আমি ভুল করে লিখেছি, এরকম কোনও কিছুই নেই, আসল পরিভাষাটি হ'লtranslation unit
শেঞ্জি

আপনার উত্তরটি সম্পূর্ণ নয় কারণ এটি বেশিরভাগ শিরোনাম ফাইলগুলিতে, অনুবাদ ইউনিটগুলিতে ব্যবহৃত হয়।
ড্রামএম

5

একটি পার্থক্য যা ভাষা স্তরে নয় তবে জনপ্রিয় বাস্তবায়ন স্তরে: সিসির কয়েকটি সংস্করণ static inlineডিফল্টরূপে আউটপুট থেকে অবাস্তব ফাংশনগুলি সরিয়ে দেবে , তবে staticঅবাস্তবহীন হলেও প্লেইন ফাংশনগুলি রাখবে । আমি নিশ্চিত নই যে এটি কোন সংস্করণে প্রযোজ্য, তবে ব্যবহারিক দৃষ্টিকোণ থেকে এর অর্থ হ'ল শিরোনামে ফাংশনগুলির inlineজন্য সর্বদা ব্যবহার করা ভাল ধারণা হতে পারে static


inlineসংজ্ঞা ব্যবহার সম্পর্কে কি ? আপনি কি এটি বোঝায় যে এটি externফাংশনগুলির জন্য ব্যবহার করছেন না ?
new_perl

এটি কি এখনও জিসিসির সাম্প্রতিক সংস্করণে সত্য? আপনার উত্তরটি আরও আকর্ষণীয় হবে যদি আপনি একটি উদাহরণ তৈরি করেন এবং জিসিসির কোন সংস্করণ এটি করেন তা তালিকাভুক্ত করা হয়।
জেড বোসন

@ জবসন: আমার কাছে সেই তথ্যটি সহজেই পাওয়া যায় না এবং এই মুহুর্তে প্রচুর জিসিসি সংস্করণ সেটআপ এবং পরীক্ষা করার সময় নেই, তবে আমি সম্মত হলাম এটি কার্যকর তথ্য হতে পারে। আপনি সম্ভবত খুঁজে পেতে পারেন যে যখন জিসিসি প্রথমে অপ্রয়োজনীয় স্থিতিশীল ফাংশন / অবজেক্টগুলির ইতিহাস attribute((used))এবং এর ব্যবহারটি এএসএমকে অন্যথায়-অনর্থনিত staticফাংশন এবং ডেটা উল্লেখ করার অনুমতি দেয় সেটির ব্যবহার দেখে অনুকূলিতকরণ শুরু করে।
আর .. গিথহাব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.