কোন ফাংশন / পদ্ধতির জন্য 'ইনলাইন' কীওয়ার্ডটি লিখব?


562

inlineসি ++ এ কখন কোন ফাংশন / পদ্ধতির কীওয়ার্ডটি লিখব ?

কিছু উত্তর দেখার পরে, কিছু সম্পর্কিত প্রশ্ন:

  • আমি কখন সি ++ এ কোনও ফাংশন / পদ্ধতির জন্য 'ইনলাইন' কীওয়ার্ডটি লিখব না ?

  • সংকলক কখন জানতে পারবে না কখন কোনও ফাংশন / পদ্ধতি 'ইনলাইন' করবেন?

  • কোনও ফাংশন / পদ্ধতির জন্য যখন কেউ 'ইনলাইন' লেখেন তখন কোনও অ্যাপ্লিকেশন মাল্টিথ্রেড হয় কিনা তা বিবেচনা করে ?


40
যদি আপনি কোনও শিরোনামে কোনও ক্রিয়া সংজ্ঞায়িত করেন তবে আপনাকে এটিকে ইনলাইন ঘোষণা করতে হবে। অন্যথায় আপনি ফাংশনের একাধিক সংজ্ঞা সম্পর্কে লিঙ্কার ত্রুটি পাবেন।
মার্টিন ইয়র্ক

15
@ মার্টিন: বাছাই করা যদি শ্রেণি সংজ্ঞায় না থাকে।
ডেভিড থর্নলি

20
@ ডেভিড: অতিরিক্ত বাছাই করার জন্য, কেবলমাত্র এই জাতীয় ফাংশনগুলি স্পষ্টভাবে চিহ্নিত করা হয়েছে inline(9.3 / 2)।
অরবিট


সি ++ এফএকিউতে ইনলাইন ফাংশনগুলিও দেখুন । তাদের ইনলাইন খুব ভাল চিকিত্সা আছে।
jww

উত্তর:


882

ওহ মানুষ, আমার পোষ্যদের মধ্যে একটি উঁকি দেয়।

inlineসংকলককে আপনার ক্রিয়াকলাপগুলিকে ইনলাইন করতে বলার চেয়ে আরও বেশি staticবা তার মতো externএকটি নির্দেশনা। extern, static, inlineদুটো ঘটনার নির্দেশনা, linker না কম্পাইলার দ্বারা প্রায় একচেটিয়াভাবে ব্যবহার করা হয়।

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

  • static- পরিবর্তনশীল / ফাংশন নামটি অন্য অনুবাদ ইউনিটে ব্যবহার করা যায় না। লিঙ্কারকে নিশ্চিত হওয়া দরকার যে এটি কোনও ট্রান্সলেট ইউনিট থেকে ঘটনাক্রমে স্থিতিযুক্ত সংজ্ঞাযুক্ত পরিবর্তনশীল / ফাংশনটি ব্যবহার করে না।

  • extern- এই অনুবাদ ইউনিটে এই পরিবর্তনশীল / ফাংশন নামটি ব্যবহার করুন তবে এটি সংজ্ঞায়িত না হলে অভিযোগ করবেন না। লিঙ্কারটি এটি বাছাই করবে এবং নিশ্চিত করবে যে কিছু কোড যা কিছু বাহ্যিক চিহ্ন ব্যবহার করার চেষ্টা করেছিল তার ঠিকানা আছে।

  • inline- এই ফাংশনটি একাধিক অনুবাদ ইউনিটে সংজ্ঞায়িত করা হবে, এটি নিয়ে চিন্তা করবেন না। লিঙ্কারটিকে অবশ্যই নিশ্চিত করতে হবে যে সমস্ত অনুবাদ ইউনিটগুলি ভেরিয়েবল / ফাংশনের একক উদাহরণ ব্যবহার করে।

দ্রষ্টব্য: সাধারণত, টেমপ্লেটগুলি ঘোষণা inlineকরা অর্থহীন, কারণ তাদের কাছে inlineইতিমধ্যে লিঙ্কেজ শব্দার্থক শব্দ রয়েছে । যাইহোক, স্পষ্ট বিশেষজ্ঞতা এবং টেমপ্লেট ইনস্ট্যান্স প্রয়োজনinline ব্যবহৃত হবে।


আপনার প্রশ্নের নির্দিষ্ট উত্তর:

  • সি ++ এ কোন ফাংশন / পদ্ধতির জন্য কখন আমি 'ইনলাইন' কীওয়ার্ডটি লিখব?

    যখন আপনি চান তখন ফাংশনটি শিরোনামে সংজ্ঞায়িত করা হয়। আরও ঠিক তখনই যখন ফাংশনের সংজ্ঞাটি একাধিক অনুবাদ ইউনিটে প্রদর্শিত হতে পারে। শিরোনাম ফাইলে ছোট (যেমন একটি লাইনারের মতো) ফাংশনগুলি সংজ্ঞায়িত করা ভাল ধারণা কারণ এটি আপনার কোডটি অনুকূলিতকরণের সময় সংকলকটির সাথে কাজ করতে আরও তথ্য দেয় information এটি সংকলনের সময়ও বাড়ায়।

  • আমি কখন সি ++ এ কোনও ফাংশন / পদ্ধতির জন্য 'ইনলাইন' কীওয়ার্ডটি লিখব না?

    ইনলাইনটি যুক্ত করবেন না কারণ আপনি মনে করেন আপনার কোডটি যদি সংকলকটি ইনলাইন করে তবে দ্রুত চলে run

  • সংকলক কখন জানতে পারবে না কখন কোনও ফাংশন / পদ্ধতি 'ইনলাইন' করবেন?

    সাধারণত, সংকলকটি আপনার চেয়ে ভাল এটি করতে সক্ষম হবে। যাইহোক, সংকলকটির ফাংশন সংজ্ঞা না থাকলে কোডটি ইনলাইন করার বিকল্প নেই। সর্বাধিক অপ্টিমাইজড কোডে সাধারণত privateআপনি জিজ্ঞাসা করেন বা না চান সে ক্ষেত্রে সমস্ত পদ্ধতি অন্তর্ভুক্ত থাকে।

    জিসিসিতে ইনলাইনিং প্রতিরোধের জন্য আলাদাভাবে, ব্যবহার __attribute__(( noinline ))এবং ভিজ্যুয়াল স্টুডিওতে, ব্যবহার __declspec(noinline)

  • কোনও ফাংশন / পদ্ধতির জন্য যখন কেউ 'ইনলাইন' লেখেন তখন কোনও অ্যাপ্লিকেশন মাল্টিথ্রেড হয় কিনা তা বিবেচনা করে?

    মাল্টিট্রেডিং কোনওভাবেই ইনলাইনিংকে প্রভাবিত করে না।


172
+1 আমি দেখেছি ইনলাইনটির সেরা বর্ণনা ... (চিরকাল)। আমি এখন আপনাকে ছিঁড়ে ফেলব এবং ইনলাইন কীওয়ার্ডের আমার সমস্ত ব্যাখ্যাগুলিতে এটি ব্যবহার করব।
মার্টিন ইয়র্ক

6
@ জিগি, আমি যা বলতে চাইছিলাম তা হ'ল সংকলক ইনলাইনিং এবং মূলশব্দটি inlineসম্পর্কিত নয়। যদিও আপনি সঠিক ধারণা পেয়েছেন। একটি নিয়ম হিসাবে, ইনলাইন করে কী উন্নত হবে তা অনুমান করা খুব ত্রুটিযুক্ত। একটি নিয়ামক হিসাবে এই নিয়মের ব্যতিক্রম।
deft_code

4
এই উত্তরটি আমাকে কিছুটা বিভ্রান্ত করে। আপনি সংকলকটি ইনলাইন করতে সক্ষম হচ্ছেন / ইনলাইন জিনিসগুলিকে আরও ভাল করতে পারবেন না সে সম্পর্কে সমস্ত কিছু বলুন। তারপরে আপনি বলছেন যে আপনার একটি শিরোনাম / ছোট ছোট ফাংশন শিরোনামে রেখে দেওয়া উচিত এবং সংকলকটি ফাংশন সংজ্ঞা ব্যতীত কোডটিকে ইনলাইন করতে পারে না। এগুলি কি কিছুটা পরস্পরবিরোধী নয়? কেন কেবল সিপিপি ফাইলে সমস্ত কিছু রাখি এবং সংকলককে সিদ্ধান্ত নিতে দেয় না?
ব্যবহারকারী 673679

5
সংকলক কেবল কল সাইটে ইনলাইন করবে যেখানে সংজ্ঞাটি কল সাইটে উপলব্ধ site সি পি পি ফাইলে সমস্ত ফাংশন রেখে দিলে সেই ফাইলের সাথে ইনলাইনিং সীমাবদ্ধ হয়ে যায়। আমি সংক্ষিপ্ত গতির ব্যয়টি নগণ্য এবং আপনার প্রায় গ্যারান্টিযুক্ত যে সংকলকটি কলটি ইনলাইন করবে তার জন্য আমি .H এ ছোট একটি লাইনার ইনলাইন সংজ্ঞায়িত করার পরামর্শ দিচ্ছি। সংকলক ইনলাইনিং সম্পর্কে আমার বক্তব্যটি হ'ল এটি অপ্টিমাইজেশনের কালো শিল্পের বন্দর, যেখানে আপনার সংকলকটি আপনার চেয়ে আরও ভাল।
deft_code

8
আমি যখনই ইন্টারনেটের ক্রমবর্ধমান জ্ঞানের অ্যাকাউন্টে কিছু পড়ি তখন জন লটনের বিখ্যাত উক্তিটি মনে করতে হবে: তথ্য যুগের বিড়ম্বনাটি হ'ল এটি অজ্ঞাত মতামতকে নতুন সম্মান দিয়েছে।
IInspectable

60

আমি এই থ্রেডের দুর্দান্ত উত্তরের সমস্তটিতে অবদান রাখতে চাই একটি দৃinc় উদাহরণ সহ অন্য কোনও ভুল বোঝাবুঝি ছড়িয়ে দিতে।

দুটি উত্স ফাইল দেওয়া যেমন:

  • inline111.cpp:

    #include <iostream>
    
    void bar();
    
    inline int fun() {
      return 111;
    }
    
    int main() {
      std::cout << "inline111: fun() = " << fun() << ", &fun = " << (void*) &fun;
      bar();
    }
  • inline222.cpp:

    #include <iostream>
    
    inline int fun() {
      return 222;
    }
    
    void bar() {
      std::cout << "inline222: fun() = " << fun() << ", &fun = " << (void*) &fun;
    }

  • কেস এ:

    সংকলন :

    g++ -std=c++11 inline111.cpp inline222.cpp

    আউটপুট :

    inline111: fun() = 111, &fun = 0x4029a0
    inline222: fun() = 111, &fun = 0x4029a0

    আলোচনা :

    1. এমনকি আপনার নিজের ইনলাইন ফাংশনগুলির অভিন্ন সংজ্ঞা থাকা উচিত, সি ++ সংকলক যদি এটি না হয় তবে এটি ফ্ল্যাগ করে না (আসলে পৃথক সংকলনের কারণে এটির পরীক্ষা করার কোনও উপায় নেই)। এটি নিশ্চিত করা আপনার নিজের দায়িত্ব!

    2. লিঙ্কার ওয়ান সংজ্ঞা বিধি সম্পর্কে অভিযোগ করে না , যেমন fun()ঘোষণা করা হয়েছে inline। যাইহোক, ইনলাইন 111.cpp হ'ল প্রথম অনুবাদ ইউনিট (যা আসলে কল করে fun()) সংকলক দ্বারা প্রক্রিয়াজাত করা হয়, সংকলকটি ইনলাইন 111.cpp-এfun() তার প্রথম কল-এনকাউন্টার পরে ইনস্ট্যান্ট করে । সংকলক যদি আপনার প্রোগ্রামের অন্য কোথাও থেকে কলটির প্রসার না বাড়ানোর সিদ্ধান্ত নেয় ( যেমন ইনলাইন 222.cpp থেকে ), কলটি সর্বদা ইনলাইন 111.cpp থেকে উত্পাদিত তার উদাহরণের সাথে লিঙ্কযুক্ত থাকবে ( ইনলাইন 222.cpp এর অভ্যন্তরে কল )fun()fun()fun()সেই অনুবাদ ইউনিটে একটি উদাহরণও তৈরি করতে পারে তবে এটি লিঙ্কযুক্ত থাকবে)। প্রকৃতপক্ষে, এটি অভিন্ন &fun = 0x4029a0প্রিন্ট আউটগুলি থেকে স্পষ্ট is

    3. অবশেষে, inlineসংকলককে আসলে ওয়ান-লাইনার প্রসারিত করার পরামর্শ দেওয়া সত্ত্বেও fun(), এটি আপনার পরামর্শটিকে সম্পূর্ণ উপেক্ষা করে , যা স্পষ্ট কারণ fun() = 111দুটি লাইনেই।


  • কেস বি:

    সংকলন (বিপরীত আদেশ বিজ্ঞপ্তি) :

    g++ -std=c++11 inline222.cpp inline111.cpp

    আউটপুট :

    inline111: fun() = 222, &fun = 0x402980
    inline222: fun() = 222, &fun = 0x402980

    আলোচনা :

    1. কেস এ-তে কী আলোচনা হয়েছে তা এই মামলাটি জোর করে ।

    2. একটি গুরুত্বপূর্ণ পয়েন্ট লক্ষ্য করুন যে, যদি আপনি খুঁজে প্রকৃত কলে মন্তব্য fun()মধ্যে inline222.cpp ( উদাঃ আউট মন্তব্য coutমধ্যে -statement inline222.cpp সম্পূর্ণরূপে) তারপর, আপনার অনুবাদ ইউনিট সংকলন অর্ডার সত্ত্বেও, fun()instantiated করা হবে উপর এটা প্রথম কল এনকাউন্টার এর inline111.cpp , কেস বি হিসাবে প্রিন্ট-আউট হিসাবে ফলস্বরূপ inline111: fun() = 111, &fun = 0x402980


  • কেস সি:

    কম্পাইল (নোটিশ -O2) :

    g++ -std=c++11 -O2 inline222.cpp inline111.cpp

    অথবা

    g++ -std=c++11 -O2 inline111.cpp inline222.cpp

    আউটপুট :

    inline111: fun() = 111, &fun = 0x402900
    inline222: fun() = 222, &fun = 0x402900

    আলোচনা :

    1. যেমন আছে এখানে বর্ণিত , -O2অপ্টিমাইজেশান কম্পাইলার উৎসাহিত করতে আসলে প্রসারিত ফাংশন যে inlined করা যেতে পারে (লক্ষ্য করুন যে -fno-inlineহয় ডিফল্ট অপ্টিমাইজেশান অপশন ছাড়াই)। এখানে আউটপ্রিন্ট থেকে স্পষ্ট যে, fun()প্রকৃতপক্ষে ইনলাইন প্রসারিত হয়েছে (সেই নির্দিষ্ট অনুবাদ ইউনিটে এর সংজ্ঞা অনুসারে ), ফলে দুটি পৃথক fun() মুদ্রণ-আউট ফলস্বরূপ । তা সত্ত্বেও এখনও শুধুমাত্র একটি কয়েক বিশ্বব্যাপী লিঙ্ক উদাহরণস্বরূপ fun(), (যেমন মান দ্বারা আবশ্যক) হিসাবে থেকে স্পষ্ট অভিন্ন &fun মুদ্রণ-আউট।

8
আপনার উত্তরটি ভাষা কেন এমন inlineফাংশনকে অপরিজ্ঞাত আচরণ করে তোলে তার একটি চিত্রণমূলক পোস্ট rative
আর সাহু

সংকলন এবং লিঙ্কিং পৃথক পৃথক ক্ষেত্রে এমন প্রত্যেকটি ক্ষেত্রে যুক্ত করা উচিত যা প্রত্যেকটির .cppনিজস্ব অনুবাদ ইউনিট রয়েছে। সাধারণত, -fltoসক্ষম / অক্ষমদের জন্য কেস যুক্ত করুন ।
syockit

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

27

টেমপ্লেট বিশেষীকরণ করার সময় আপনার স্পষ্টত আপনার ফাংশনটি ইনলাইন করা দরকার (যদি বিশেষায়িতকরণ .h ফাইলটিতে থাকে)


21

1) আজকাল, প্রায় কখনও না। যদি কোনও ফাংশনটি ইনলাইন করা ভাল ধারণা হয় তবে সংকলকটি আপনার সহায়তা ছাড়াই এটি করবে।

2) সর্বদা। # 1 দেখুন।

(আপনি আপনার প্রশ্নটিকে দুটি প্রশ্নে বিভক্ত করেছেন তা প্রতিফলিত করার জন্য সম্পাদিত ...)


হ্যাঁ. ইনলাইনটি কেবল সংকলকটির একটি ইঙ্গিত, এবং আপনাকে এড়িয়ে চলা বিনামূল্যে। এই দিনগুলিতে সংকলক সম্ভবত প্রোগ্রামারটির চেয়ে ভাল জানে যেগুলি ফাংশনগুলি ইনলাইন করা ভাল।
মার্ক বাইয়ার্স

1
হ্যাঁ, তবে এটি কম প্রাসঙ্গিক - কোনও ক্রিয়াকলাপটি অন্তর্ভুক্ত হওয়ার জন্য, তার দেহটি অবশ্যই একই সংকলনের ইউনিটে থাকতে হবে (উদাহরণস্বরূপ, শিরোনামে)। এটি সি প্রোগ্রামগুলিতে কম সাধারণ।
মাইকেল কোহেন

1
কোনও সদস্যবিহীন ফাংশন টেম্পলেট (ওরফ অ-স্ট্যাটিক ফাংশন টেম্পলেট) সংজ্ঞায়িত করার জন্য ইনলাইন লাগবে না। একটি সংজ্ঞা বিধি দেখুন (3.2 / 5)।
deft_code

2
-1: inlineএখনও প্রয়োজন, উদাহরণস্বরূপ একটি শিরোনাম ফাইলে কোনও ফাংশন সংজ্ঞায়িত করার জন্য (এবং এটি বেশ কয়েকটি সংকলনের ইউনিটে এই জাতীয় ফাংশনটি অন্তর্ভুক্ত করার জন্য প্রয়োজন)।
মেলিবিয়াস

1
@ That'sটিইন যা বাস্তবায়ন-নির্দিষ্ট। মান অনুসারে, এখানে একটি সংজ্ঞা বিধি রয়েছে, যার অর্থ এখানে যদি আপনি নির্লিপ্তভাবে একাধিক অনুবাদ ইউনিটে ফাংশন সংজ্ঞাটি অন্তর্ভুক্ত করেন তবে আপনি একটি ত্রুটি পাবেন। তবে যদি সেই ফাংশনটির inlineসুনির্দিষ্ট থাকে, তবে এর দৃষ্টান্তগুলি স্বয়ংক্রিয়ভাবে লিংকের দ্বারা একটিতে বিভক্ত হয়ে যায়, এবং ওডিআর ব্যবহার হয় না।
রুসলান

12

আমি কখন সি ++ এ কোনও ফাংশন / পদ্ধতির জন্য 'ইনলাইন' কীওয়ার্ডটি লিখব না?

যদি ফাংশনটি শিরোনামে ঘোষণা করা হয় এবং .cppফাইলটিতে সংজ্ঞায়িত করা হয় তবে আপনার কীওয়ার্ডটি লেখা উচিত নয়

সংকলক কখন জানতে পারবে না কখন কোনও ফাংশন / পদ্ধতি 'ইনলাইন' করবেন?

তেমন কোনও পরিস্থিতি নেই। সংকলক কোনও কার্য ইনলাইন করতে পারে না। এটি যা করতে পারে তা হ'ল ফাংশনে কিছু বা সমস্ত কল ইনলাইন করা। এটি ফাংশনের কোড না পেলে এটি করতে পারে না (সেক্ষেত্রে লিঙ্কার যদি এটি করতে সক্ষম হয় তবে এটি করা দরকার)।

কোনও ফাংশন / পদ্ধতির জন্য যখন কেউ 'ইনলাইন' লেখেন তখন কোনও অ্যাপ্লিকেশন মাল্টিথ্রেড হয় কিনা তা বিবেচনা করে?

না, এটি মোটেও গুরুত্বপূর্ণ নয়।


এমন কেস রয়েছে যেখানে .cpp ফাইলে ইনলাইন ব্যবহার করা উপযুক্ত। উদাহরণস্বরূপ কোডটিতে সম্পূর্ণরূপে নির্দিষ্টকরণের জন্য অনুকূলিতকরণ প্রয়োগ করা।
রবিন ডেভিস

@ রবিনড্যাভিস আপডেট হওয়া উত্তর। মনে হচ্ছে আপনি কী লিখতে চেয়েছিলেন তা ভুল বুঝেছেন।
জোহানেস স্কাউব - লিটব

5
  • সংকলক কখন জানতে পারবে না কখন কোনও ফাংশন / পদ্ধতি 'ইনলাইন' করবেন?

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

চারপাশে একাধিক থ্রেড পড়ার পরে আমি কৌতূহলের বাইরে চেষ্টা করেছিলাম যে কোডটি আমি কেবলমাত্র কাজ করছি তাতে ইনলাইনটির প্রভাবগুলি এবং ফলাফলগুলি হ'ল আমি জিসিসির জন্য পরিমাপযোগ্য স্পিডআপ পেয়েছি এবং ইন্টেল সংকলকটির জন্য কোনও গতি নেই।

(আরও বিশদ: ক্লাসের বাইরে সংজ্ঞায়িত কয়েকটি সমালোচনামূলক ফাংশন সহ গণিতের সিমুলেশনগুলি, জিসিসি 4.6.3 (জি ++ -ओ 3), আইসিসি 13.1.0 (আইসিপিসি-ও 3); সমালোচনামূলক পয়েন্টগুলিতে ইনলাইন যুক্ত করে জিসিসি কোডের সাথে 6% গতিবেগ তৈরি হয়েছিল)।

সুতরাং আপনি যদি আধুনিক সংকলক হিসাবে জিসিসি ৪.6 যোগ্যতা অর্জন করেন তবে ফলস্বরূপ যে আপনি সিপিইউ নিবিড় কাজগুলি লিখেছেন এবং ঠিক কোথায় বাধা আছে তা জেনে রাখলে ইনলাইন নির্দেশিকাটি এখনও গুরুত্বপূর্ণ।


6
আপনার দাবির ব্যাক আপ নিতে আমি আরও প্রমাণ দেখতে চাই। দয়া করে আপনি যে কোডটি পরীক্ষা করছেন সেগুলি সরবরাহ করুন পাশাপাশি ইনলাইন কীওয়ার্ড সহ এবং ছাড়াই এসেম্বলারের আউটপুট। যে কোনও সংখ্যক জিনিস আপনাকে পারফরম্যান্স সুবিধা দিতে পারে।
void.pointer

1
অবশেষে এমন কেউ যিনি কেবল অন্যরা যা বলেন সেটির পুনরাবৃত্তি করে না, তবে প্রকৃতপক্ষে সেই বিবৃতিগুলি যাচাই করে। জিসিসি প্রকৃতপক্ষে এখনও ইনলাইন কীওয়ার্ডটিকে একটি ইঙ্গিত হিসাবে বিবেচনা করে (আমি মনে করি ঝনঝন এটি সম্পূর্ণ উপেক্ষা করে)।
মাইকএমবি

@ শূন্য.পয়েন্টার: বিশ্বাস করা এত কঠিন কেন? যদি অপ্টিমাইজারগুলি ইতিমধ্যে নিখুঁত ছিল তবে নতুন সংস্করণগুলি প্রোগ্রামের কার্যকারিতা উন্নত করতে পারে না। তবে তারা নিয়মিত করে।
মাইক এমবি

3

বাস্তবে, কখনও কখনও না। আপনি যা করছেন তা বোঝাচ্ছে যে সংকলক একটি প্রদত্ত ফাংশনটি ইনলাইন করুন (যেমন, এই ফাংশনে সমস্ত কলগুলি প্রতিস্থাপন করুন / তার শরীরের ডাব্লু)। অবশ্যই কোনও গ্যারান্টি নেই: সংকলক নির্দেশকে অগ্রাহ্য করতে পারে।

সংকলকটি সাধারণত + এই জাতীয় জিনিসগুলিকে সনাক্তকরণের জন্য ভাল কাজ করবে।


7
সমস্যা হল inlineএকটি আছে শব্দার্থিক সি ++ (যেমন উপায় একাধিক সংজ্ঞা চিকিত্সা করা হয় মধ্যে), যা কিছু কিছু ক্ষেত্রে গুরুত্বপূর্ণ (যেমন টেমপ্লেট) পার্থক্য।
পাভেল মিনায়েভ

4
প্রতীকটির একাধিক সংজ্ঞা রয়েছে এমন ক্ষেত্রে সমাধান করতে ইনলাইন ব্যবহার করা হয়। টেমপ্লেটগুলি ইতিমধ্যে ভাষা দ্বারা পরিচালিত হয়। একটি ব্যতিক্রম একটি বিশেষায়িত টেম্পলেট ফাংশন যার কোনও টেম্পলেট প্যারামটার নেই (টেমপ্লেট <>)। এগুলি টেমপ্লেটগুলির চেয়ে ফাংশনের মতো আরও চিকিত্সা করা হয় এবং তাই লিঙ্ক করার জন্য ইনলাইন কীওয়ার্ডের প্রয়োজন।
deft_code

2

অপ্টিমাইজেশন সক্ষম না করে সংকলন করার সময় ডিফল্টরূপে জিসিসি কোনও ফাংশনকে ইনলাইন করে না। আমি ভিজ্যুয়াল স্টুডিও - ডিফিট_কোড সম্পর্কে জানি না

আমি ভিজ্যুয়াল স্টুডিও 9 (15.00.30729.01) এর জন্য / এফএএসিএসের সাথে সংকলন করে এবং এসেম্বলি কোডটি দেখে পরীক্ষা করেছি: সংকলকটি ডিবাগ মোডে সক্ষম হওয়া ছাড়া অপ্টিমাইজেশন ছাড়াই সদস্য ফাংশনগুলিতে কল উত্পন্ন করেছিল । এমনকি যদি ফাংশনটি __ফোর্সলাইন দ্বারা চিহ্নিত করা হয় তবে কোনও ইনলাইন রানটাইম কোড তৈরি করা হয় না।


1
কোন ফাংশনটি ইনলাইন চিহ্নিত হয়েছে তবে প্রকৃতপক্ষে ইনলাইন করা হয়নি
পলম

0

রিটার্ন টাইপের আগে আপনি একে একে একে একে একে শুরু করতে চান। তবে বেশিরভাগ সংকলক এটি এড়িয়ে যান। যদি এটি সংজ্ঞায়িত হয়, এবং এতে কোডের একটি ছোট ব্লক থাকে, তবে বেশিরভাগ সংকলকরা এটিকে যাইহোক ইনলাইন বিবেচনা করে।


0

আপনি যদি কোনও গ্রন্থাগার না লিখে থাকেন বা বিশেষ কারন না থাকে তবে আপনি পরিবর্তে লিংক-টাইম অপ্টিমাইজেশনটি ভুলে যেতে inlineএবং ব্যবহার করতে পারেন । এটি প্রয়োজনীয়তা সরিয়ে দেয় যে কোনও ক্রিয়া সংজ্ঞাটি সংকলন ইউনিটগুলিতে ইনলাইনিংয়ের জন্য বিবেচিত হওয়ার জন্য এটি একটি শিরোনামের মধ্যে থাকতে হবে, যা সঠিকভাবে এটি অনুমতি দেয় allowsinline

(তবে দেখুন লিংক টাইম অপ্টিমাইজেশন ব্যবহার না করার কোনও কারণ আছে কি? )


0

সি ++ ইনলাইন সি ইনলাইন থেকে সম্পূর্ণ আলাদা।

#include <iostream>
extern inline int i[];
int i [5];
struct c {
  int function (){return 1;} //implicitly inline
  static inline int j = 3; //explicitly inline
};
int main() {
  c j;
  std::cout << i;
}

inlineসংকলক, এসেম্বলার এবং লিঙ্কারটিকে তার নিজের উপর প্রভাব ফেলে। এটি সংকলকটির নির্দেশিকা যা কেবল অনুবাদ ফাংশনে / ডেটা ব্যবহার করে যদি এটি অনুবাদ ইউনিটে ব্যবহৃত হয় এবং যদি এটি হয় তবে শ্রেণিবদ্ধ পদ্ধতিগুলির মতো এসেম্বলবারকে তাদের বিভাগে .section .text.c::function(),"axG",@progbits,c::function(),comdatবা .section .bss.i,"awG",@nobits,i,comdatডেটা সংরক্ষণ করার জন্য বলুন।

এইটা নিচের .section name, "flags"MG, @type, entsize, GroupName[, linkage]। উদাহরণস্বরূপ, বিভাগটির নাম .text.c::function()axGমানে এই বিভাগটি বরাদ্দযোগ্য, নির্বাহযোগ্য এবং একটি গ্রুপে একটি গ্রুপের নাম নির্দিষ্ট করা হবে (এবং কোনও এম পতাকা নেই তাই কোনও এনটসাইজ নির্দিষ্ট করা হবে না); @progbitsমানে বিভাগটিতে ডেটা রয়েছে এবং ফাঁকা নয়; c::function()গ্রুপের নাম এবং গ্রুপটি রয়েছেcomdatসংযুক্তির অর্থ যে সমস্ত বস্তু ফাইলগুলিতে, কমড্যাট সহ ট্যাগ করা এই গোষ্ঠীর নামের সাথে দেখা সমস্ত বিভাগ চূড়ান্ত নির্বাহী থেকে বাদ দেওয়া হবে 1 ব্যতীত সংকলকটি নিশ্চিত করে তোলে যে অনুবাদ ইউনিটে কেবল একটি সংজ্ঞা আছে এবং তারপরে এসেম্বলারের বলার জন্য এটি তার নিজের গ্রুপে অবজেক্ট ফাইলে (1 টি বিভাগে 1 বিভাগ) এবং তারপরে লিঙ্কারটি নিশ্চিত করবে যে কোনও বস্তুর ফাইলগুলির যদি একই নামের একটি গ্রুপ থাকে তবে কেবলমাত্র চূড়ান্ত .exe এ একটি অন্তর্ভুক্ত করা উচিত। মধ্যে পার্থক্য inlineএবং ব্যবহার করছেন না inline, কারণ এটা নিয়মিত সঞ্চিত না, এখন প্রতীকী ভাষান্তর প্রয়োজন এবং linker ফলে দৃশ্যমান .dataবা .textতাদের নির্দেশনা কারণে ইত্যাদি প্রতীকী ভাষান্তর দ্বারা।

static inlineশ্রেণিতে এটির অর্থ এটি একটি প্রকারের সংজ্ঞা এবং ঘোষণা নয় (স্থির সদস্যকে শ্রেণিতে সংজ্ঞায়িত করার অনুমতি দেয়) এবং এটিকে ইনলাইন করা; এটি এখন উপরের মতো আচরণ করে।

static inlineফাইল স্কোপে কেবল সংকলককে প্রভাবিত করে। সংকলকটির অর্থ: এটি অনুবাদ ইউনিটে ব্যবহৃত হলে কেবল এই ফাংশন / ডেটার জন্য একটি প্রতীক প্রেরণ করুন এবং এটি নিয়মিত স্ট্যাটিক প্রতীক হিসাবে করুন (.globl ডিরেক্টরি ছাড়াই in.text /.data সঞ্চয় করুন)। সমাবেশকারীর কাছে এখন staticএবং এর মধ্যে কোনও পার্থক্য নেইstatic inline

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

extern inline int i[];
extern int i[]; //allowed repetition of declaration with incomplete type, inherits inline property
extern int i[5]; //declaration now has complete type
extern int i[5]; //allowed redeclaration if it is the same complete type or has not yet been completed
extern int i[6]; //error, redeclaration with different complete type
int i[5]; //definition, must have complete type and same complete type as the declaration if there is a declaration with a complete type

ত্রুটি লাইন ছাড়া উপরের পুরোটি ধসে পড়ে inline int i[5]। স্পষ্টতই যদি আপনি তা করেন extern inline int i[] = {5};তবে externনিয়োগের মাধ্যমে স্পষ্ট সংজ্ঞা দেওয়ার কারণে তা উপেক্ষা করা হবে।

inlineএকটি নেমস্পেসে, এটি এবং এটি দেখুন


0

ইনলাইন কীওয়ার্ডটি ফাংশনটির মূল অংশের সাথে ফাংশন কলটি প্রতিস্থাপনের জন্য কম্পাইলারকে অনুরোধ করে, এটি প্রথমে এক্সপ্রেশনটি মূল্যায়ন করে এবং পরে পাস করে t এটি ফাংশন কল ওভারহেড হ্রাস করে কারণ ফাংশনের জন্য রিটার্ন ঠিকানা সংরক্ষণ করার প্রয়োজন নেই এবং স্ট্যাক মেমরির প্রয়োজন নেই যুক্তি.

কখন ব্যবহার করতে হবে:

  • কর্মক্ষমতা উন্নত করতে
  • কল ওভারহেড কমাতে।
  • এটি কম্পাইলারের কাছে কেবল একটি অনুরোধ হিসাবে, নির্দিষ্ট ফাংশনগুলি ইনডেল করা হবে না * বড় ফাংশনগুলি
    • অনেকগুলি শর্তাধীন তর্ক রয়েছে functions
    • লুপগুলি সহ পুনরাবৃত্তির কোড এবং কোড etc.

-1

কোড বিকাশ এবং ডিবাগিংয়ের সময়, ছেড়ে inlineযান। এটি ডিবাগিং জটিল করে তোলে।

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

অ্যালগরিদম সমাপ্তির আগে পারফরম্যান্স অপটিমাইজেশন সম্পর্কে এই ধরণের চিন্তাভাবনা অকাল অপ্টিমাইজেশন


12
inlineঅপ্টিমাইজেশানগুলি সংকলন না করা হলে সাধারণত ফাংশনগুলি ইনলাইন করা হয় না, সুতরাং তারা কোনওভাবেই ডিবাগিংকে প্রভাবিত করে না। মনে রাখবেন এটি কোনও ইঙ্গিত, দাবি নয়।
পাভেল মিনায়েভ

3
অপ্টিমাইজেশন সক্ষম না করে সংকলন করার সময় ডিফল্টরূপে জিসিসি কোনও ফাংশনকে ইনলাইন করে না। আমি ভিজ্যুয়াল স্টুডিও সম্পর্কে জানি না
deft_code

আমি একটি বিরাট জি ++ প্রকল্পে কাজ করেছি যা ডিবাগিং সক্ষম করেছে had হতে পারে অন্যান্য বিকল্পগুলি এটি প্রতিরোধ করেছিল, তবে inlineকার্যকারিতাটি অন্তর্ভুক্ত ছিল। তাদের মধ্যে একটি অর্থবহ ব্রেকপয়েন্ট স্থাপন করা অসম্ভব ছিল।
wallyk

2
ডিবাগিং সক্ষম করা জিসিসিতে ইনলাইন করা বন্ধ করে না। যদি কোনও অপ্টিমাইজেশন যেখানে সক্ষম থাকে (-O1 বা ততোধিক), সেক্ষেত্রে জিসিসি সবচেয়ে সুস্পষ্ট কেসগুলিকে ইনলাইন করার চেষ্টা করবে। Ditionতিহ্যগতভাবে জিডিবি ব্রেকপয়েন্ট এবং নির্মাণকারী বিশেষত ইনলাইন কনস্ট্রাক্টরগুলির সাথে একটি কঠিন সময় কাটিয়েছে। তবে, এটি সাম্প্রতিক সংস্করণগুলিতে স্থির করা হয়েছে (কমপক্ষে 7.7, খুব শীঘ্রই)।
deft_code

2
সংযোজন inlineকোনও আধুনিক সংকলকটিতে কোডটি উন্নত করতে কিছুই করবে না, যা নিজেরাই ইনলাইন করবে কিনা তা নির্ধারণ করতে পারে।
ডেভিড থর্নলি

-1

যখন কোন একটি ইনলাইন করা উচিত:

1. যখন ফাংশনটিকে প্যারামিটার পাসিং, কন্ট্রোল ট্রান্সফার, কন্ট্রোল রিটার্ন ইত্যাদি বলা হয় তখন যখন কেউ ওভারহেড এড়াতে চান want

২.এ ফাংশনটি ছোট হওয়া উচিত, প্রায়শই বলা হয় এবং ইনলাইন তৈরি করা সত্যই সুবিধাজনক কারণ ৮০-২০ নিয়ম অনুসারে, সেই ফাংশনটিকে ইনলাইন করার চেষ্টা করুন যা প্রোগ্রামের কার্য সম্পাদনে বড় প্রভাব ফেলে।

যেহেতু আমরা জানি যে ইনলাইনটি কেবল নিবন্ধের অনুরূপ সংকলক করার অনুরোধ এবং এটি আপনাকে অবজেক্ট কোড আকারে ব্যয় করতে পারে।


"ইনলাইন হ'ল নিবন্ধের অনুরূপ সংকলক করার অনুরোধ" এগুলি একই কারণ অনুরোধ বা অপ্টিমাইজেশনের সাথে কিছু করার নেই। inlineঅপ্টিমাইজেশনের ইঙ্গিত হিসাবে তার স্থিতিটি হারিয়েছে এবং বেশিরভাগ সংকলক কেবলমাত্র একাধিক সংজ্ঞার জন্য ভাতা দেওয়ার জন্য এটি ব্যবহার করে - আইএমও হিসাবে তাদের উচিত। আরও, সি ++ ১১, যেহেতু register'কীভাবে অপ্টিমাইজ করতে হয় তা সংকলকটির চেয়ে আমি আরও ভাল জানি' এর পূর্বের অর্থের জন্য পুরোপুরি অবহেলা করা হয়েছে: এটি এখন কোনও বর্তমান অর্থ ছাড়াই কেবল একটি সংরক্ষিত শব্দ।
আন্ডারস্কোর_২

@ মাউন্ডসওয়ার_ডি: জিসিসি এখনও inlineকিছুটা ডিগ্রি শুনে ।
মাইক এমবি

-1

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

একটি ইনলাইন ফাংশনে যে কোনও পরিবর্তনের জন্য ফাংশনের সমস্ত ক্লায়েন্টকে পুনরায় সংযুক্ত করা দরকার কারণ সংকলককে আবার সমস্ত কোড পুনরায় প্রতিস্থাপন করতে হবে অন্যথায় এটি পুরানো কার্যকারিতা সহ চলতে থাকবে।

কোনও ফাংশনটি ইনলাইন করতে, ফাংশনের নামের আগে কীওয়ার্ডটি ইনলাইন করুন এবং ফাংশনে কোনও কল করার আগে ফাংশনটি সংজ্ঞায়িত করুন। সংজ্ঞায়িত কার্যটি কোনও লাইনের চেয়ে বেশি ক্ষেত্রে ইনলাইন যোগ্যতা উপেক্ষা করতে পারে।

শ্রেণীর সংজ্ঞায় একটি ফাংশন সংজ্ঞা একটি ইনলাইন ফাংশন সংজ্ঞা, এমনকি ইনলাইন নির্দিষ্টকরণকারক ব্যবহার না করেই।

নিম্নলিখিতটি একটি উদাহরণ, যা দুটি সংখ্যার সর্বাধিক ফিরিয়ে আনতে ইনলাইন ফাংশনটি ব্যবহার করে

#include <iostream>

using namespace std;

inline int Max(int x, int y) { return (x > y)? x : y; }

// Main function for the program
int main() {
   cout << "Max (100,1010): " << Max(100,1010) << endl;

   return 0;
}

আরও তথ্যের জন্য এখানে দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.