সি ++ এ ইনলাইন ফাংশনগুলির সুবিধা?


254

সি ++ এ ইনলাইন ফাংশনগুলি ব্যবহার করার সুবিধা / অসুবিধাগুলি কী? আমি দেখতে পাচ্ছি যে এটি কেবল সংস্থাপক আউটপুট করে কোডটির জন্য কর্মক্ষমতা বাড়িয়ে তোলে তবে আজকের অনুকূলিত সংকলক, দ্রুত সিপিইউ, বিশাল স্মৃতি ইত্যাদির সাথে (1980 এর মত নয়) যেখানে মেমরির ঘাটতি ছিল এবং সবকিছুই 100 কেবি মেমরির মধ্যে ফিট করতে পারে) কি আজ তাদের সত্যিকারের কি সুবিধা আছে?


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

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

10
এই প্রশ্নের ভিত্তি ত্রুটিযুক্ত। সংকলন চলাকালীন সংকলকগুলির ইনলাইনিংয়ের সাথে সি ++ ইনলাইন ফাংশনগুলির খুব কম সম্পর্ক রয়েছে। এটি দুর্ভাগ্যজনক যে inlineএকটি সি ++ কীওয়ার্ড এবং ইনলাইনিংটি একটি সংকলক অপটিমাইজেশন কৌশল। সঠিক উত্তরটির জন্য " কখন inlineএকটি ফাংশন / পদ্ধতির কীওয়ার্ডটি লিখতে হবে " এই প্রশ্নটি দেখুন ।
deft_code

3
@ জোসেভেগা আপনার লিঙ্কটি মিশে গেছে

উত্তর:


143

ইনলাইন ফাংশনগুলি দ্রুততর কারণ আপনাকে প্যারামিটারগুলি এবং ফেরতের ঠিকানার মতো স্ট্যাকটি স্ট্যাক চালু / বন্ধ করার দরকার নেই; তবে এটি আপনার বাইনারিটি কিছুটা বড় করে তোলে।

এটি একটি উল্লেখযোগ্য পার্থক্য করতে পারে? বেশিরভাগ ক্ষেত্রে আধুনিক হার্ডওয়্যারগুলিতে লক্ষণীয়ভাবে যথেষ্ট নয়। তবে এটি একটি পার্থক্য করতে পারে, যা কিছু লোকের পক্ষে যথেষ্ট।

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

আমি সনাক্তকারী পার্থক্য তৈরি করে এমন পরিস্থিতি দেখতে পেলাম:

inline int aplusb_pow2(int a, int b) {
  return (a + b)*(a + b) ;
}

for(int a = 0; a < 900000; ++a)
    for(int b = 0; b < 900000; ++b)
        aplusb_pow2(a, b);

26
যেহেতু আমি সন্দেহ করেছি যে ইনলাইনিং উপরেরটির সাথে কোনও পার্থক্য করে না। জিসিসি 4.01 সহ সংকলিত। সংস্করণ 1 ইনলাইনিং ব্যবহার করতে বাধ্য করেছে: 48.318u 1.042 এস 5: 51.39 99.4% 0 + 0 কে 0 + 0 আইও 0 পিএফ + 0w সংস্করণ 2 জোর করে কোনও ইনলাইনিং করতে বাধ্য করেছে 348.311u 1.019s 5: 52.31 99.1% 0 + 0 কে 0 + 0 টিও 0 পিএফ + 0 এ এটি একটি ভাল উদাহরণ ছিল সাধারণ জ্ঞান ভুল is
মার্টিন ইয়র্ক

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

31
এটি সম্ভবত এই স্নিপেটে কোনও পার্থক্য তৈরি করে না কারণ ফাংশনের ফলাফল কখনই ব্যবহৃত হয় না বা ফাংশনটির কোনও পার্শ্ব প্রতিক্রিয়াও নেই। আমরা ইমেজ প্রসেসিং ইনলাইনিং একটি পরিমাপযোগ্য পারফরম্যান্স লাভ দেখতে।
থামাল

4
কোনও পার্থক্যের কারণ হতে পারে না যে সংকলকটি নিজের মত করে ইনলাইন করতে পারে; অথবা কোডটি ছোট তাই কোনও কোড প্রিফেচ সমস্যা নেই।
einpoklum

3
@ আইনপোকলুম এই কারণে সংকলকটি এমনকি পুরো লুপটিকে অপ্টিমাইজ করেছে।
noɥʇʎԀʎzɐɹƆ

197

সুবিধাদি

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

অসুবিধেও

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

ইনলাইনিং ম্যাজিক

  • সংকলকটি আপনাকে ইনলাইন হিসাবে চিহ্নিত ফাংশনগুলিকে ইনলাইন করতে পারে বা নাও করতে পারে; এটি সংকলন বা লিঙ্কিংয়ের সময় ইনলাইন হিসাবে চিহ্নিত না করে ফাংশনগুলি ইনলাইন করার সিদ্ধান্ত নিতে পারে।
  • ইনলাইন সংকলক দ্বারা নিয়ন্ত্রিত একটি অনুলিপি / পেস্টের মতো কাজ করে যা প্রি-প্রসেসরের ম্যাক্রোর থেকে একেবারেই আলাদা: ম্যাক্রো জোর করে linedুকিয়ে দেওয়া হবে, সমস্ত নেমস্পেস এবং কোডকে দূষিত করবে, সহজে ডিবাজযোগ্য হবে না এবং এমনকি এটি করা হবে সংকলক যদি এটি অকার্যকর হিসাবে শাসিত হত।
  • শ্রেণীর দেহের অভ্যন্তরে সংজ্ঞায়িত শ্রেণীর প্রতিটি পদ্ধতি নিজেই "ইনলাইনড" হিসাবে বিবেচিত হয় (এমনকি সংকলক এখনও এটিকে ইনলাইন না করার সিদ্ধান্ত নিতে পারে
  • ভার্চুয়াল পদ্ধতিগুলি অবিচ্ছিন্ন থাকার কথা না। তবুও, কখনও কখনও, যখন সংকলক নিশ্চিতভাবে জানতে পারে যে বস্তুর ধরণটি (যেমন বস্তুটি একই ফাংশন বডির অভ্যন্তরে ঘোষণা করা হয়েছিল এবং এটি নির্মিত হয়েছিল), এমনকি ভার্চুয়াল ফাংশনও অন্তর্ভূক্ত হবে কারণ সংকলকটি অবজেক্টের ধরণটি সঠিকভাবে জানে।
  • টেম্পলেট পদ্ধতি / ফাংশন সবসময় ইনলাইন করা হয় না (একটি শিরোনামে তাদের উপস্থিতি এগুলি স্বয়ংক্রিয়ভাবে ইনলাইন করে না)।
  • "ইনলাইন" পরবর্তী পরবর্তী পদক্ষেপটি টেমপ্লেট রূপান্তরকাজ। উদাহরণস্বরূপ, সংকলনের সময় আপনার কোডটি "ইনলাইন করে", কখনও কখনও সংকলক কোনও ফাংশনের চূড়ান্ত ফলাফলটি হ্রাস করতে পারে ... সুতরাং জটিল অ্যালগরিদমকে কখনও কখনও এক ধরণের return 42 ;বিবৃতিতে হ্রাস করা যায় । এটি আমার পক্ষে চরম অন্তর্নিহিত । এটি বাস্তব জীবনে খুব কমই ঘটে থাকে, এটি সংকলনের সময়কে আরও দীর্ঘায়িত করে, আপনার কোডটি ফুলবে না এবং আপনার কোডটি আরও দ্রুত তৈরি করবে। তবে কসাইয়ের মতো, এটিকে সর্বত্র প্রয়োগ করার চেষ্টা করবেন না কারণ বেশিরভাগ প্রক্রিয়াজাতকরণ এইভাবে সমাধান করা যায় না ... তবুও, এটি যাইহোক দুর্দান্ত ...
    :-p

আপনি বলেছিলেন এটি আপনার encapsulation সামান্য বিরতি দেয়। আপনি দয়া করে একটি উদাহরণ ব্যবহার করে ব্যাখ্যা করবেন?
ধ্বংসকারী

6
@ প্রবাসীমিট: এটি সি ++। ধরা যাক আপনি কোনও ক্লায়েন্টকে একটি ডিএলএল / ভাগ করা লাইব্রেরি সরবরাহ করেছেন, যিনি এর বিপরীতে সংকলন করেন। ইনলাইন ফাংশন ফু, সদস্য ভেরিয়েবল এক্স ব্যবহার করে এবং কাজ করে ক্লায়েন্টের কোডটি ইনলাইন হয়ে যাবে। আসুন আপনার ডিএলএলটির একটি আপডেট সংস্করণ সরবরাহ করার দরকার আছে যেখানে আপনি সদস্যের পরিবর্তনশীলটি জেডে পরিণত করেছেন, এবং ওয়াইয়ের সাথে কাজ ছাড়াও একটি কাজ ওয়াই যুক্ত করুন client ক্লায়েন্ট কেবল তাদের প্রকল্পে ডিএলএল এবং বুমকে অনুলিপি করে, কারণ foo এর কোড তাদের বাইনারিটিতে আপনি লিখেছেন এমন আপডেট কোড নয় ... ক্লায়েন্টটি আপনার ব্যক্তিগত কোডটিতে আইনী অ্যাক্সেস না থাকা সত্ত্বেও, ইনলাইনিং এটিকে বেশ "পাবলিক" করে তোলে।
পারাসেবল

@ পেয়ারসাবল আপনার দ্বিতীয় থেকে শেষ বুলেট পয়েন্ট সম্পর্কে, আপনি যখন কোনও ফাংশন টেম্পলেটটি ইনলাইন না হন তার উদাহরণ দিতে পারেন ? আমি ভেবেছিলাম তারা সর্বদা ইনলাইন, যদিও এখন আমার কাছে কোনও রেফারেন্স হস্তে নেই (একটি সহজ পরীক্ষা যদিও এটি নিশ্চিত করেছে)।
কনরাড রুডলফ

@KonradRudolph সালে n4594 আমি দেখুন: 3.2/6: There can be more than one definition of [..] inline function with external linkage [..] non-static function template। 5.1.5 / 6 এ For a generic lambda, the closure type has a public inline function call operator member template। এবং 7.1.2/2: the use of inline keyword is to declare an inline functionযেখানে কল করার সময় ফাংশন বডিটি ইনলাইন করার পরামর্শ দেওয়া হচ্ছে। সুতরাং, আমি উপসংহারে পৌঁছেছি যে তারা যদি একই আচরণ করতে পারে তবে ইনলাইন ফাংশন এবং ফাংশন টেমপ্লেটগুলি এখনও পৃথক, অরথোগোনাল ধারণাগুলি মিশ্রিত করা যায় (অর্থাত্ ইনলাইন ফাংশন টেম্পলেট)
প্যাসেসারবাল

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

42

প্রত্নতাত্ত্বিক সি এবং সি ++ এর inlineমতো register: সম্ভাব্য অপ্টিমাইজেশান সম্পর্কে সংকলককে একটি পরামর্শ (পরামর্শ ছাড়া আর কিছুই নয়)।

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

inline লিঙ্কারের দ্বারা "একাধিক সংজ্ঞা" ত্রুটি না পেয়ে একাধিক উত্সকে এটি অন্তর্ভুক্ত করার জন্য কোনও শিরোনাম ফাইলটিতে কোনও ফাংশন (যত জটিল বা "লিনিয়ার" নির্ধারণ করা হয়) তা সংজ্ঞায়িত করা বাধ্যতামূলক।

শ্রেণীর ভিতরে সংজ্ঞায়িত সদস্য ফাংশনগুলি ডিফল্ট হিসাবে "ইনলাইন" হয়, যেমন টেমপ্লেট ফাংশন (বৈশ্বিক ফাংশনগুলির বিপরীতে)।

//fileA.h
inline void afunc()
{ std::cout << "this is afunc" << std::endl; }

//file1.cpp
#include "fileA.h"
void acall()
{ afunc(); }

//main.cpp
#include "fileA.h"
void acall();

int main()
{ 
   afunc(); 
   acall();
}

//output
this is afunc
this is afunc

দুটি .cpp ফাইলে fileA.h এর অন্তর্ভুক্তিটি নোট করুন, যার দুটি উদাহরণ রয়েছে afunc()। লিঙ্কার তাদের মধ্যে একটি ফেলে দেবে। যদি কোনও inlineনির্দিষ্ট না করা থাকে তবে লিঙ্কার অভিযোগ করবে।


16

ইনলাইনিং সংকলকটির একটি পরামর্শ যা এটিকে উপেক্ষা করা মুক্ত। কোডের ছোট বিটের জন্য এটি আদর্শ।

যদি আপনার ফাংশনটি ইনলাইন করা থাকে তবে এটি মূলত কোনও পৃথক ফাংশন কল করার পরিবর্তে কোডটিতে সন্নিবেশ করা হয় যেখানে ফাংশন কলটি এটি করা হয়। আপনাকে প্রকৃত কল করতে হবে না বলে এটি গতিতে সহায়তা করতে পারে।

এটি সিপিইউগুলিকে পাইপলাইনে সহায়তা করে কারণ তাদের কোনও কলের কারণে নতুন নির্দেশাবলীর সাথে পাইপলাইনটি পুনরায় লোড করতে হবে না।

একমাত্র অসুবিধাই বাইনারি আকার বাড়ানো সম্ভব তবে যতক্ষণ না কার্যগুলি ছোট হয় ততক্ষণ এটি খুব বেশি গুরুত্ব পাবে না।

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


12

ইনলাইন ফাংশন হ'ল সংকলকগণ দ্বারা ব্যবহৃত অপটিমাইজেশন কৌশল। ফাংশন ইনলাইন করতে প্রোটোটাইপ ফাংশন করার জন্য একটি সহজেই ইনলাইন কীওয়ার্ডটি প্রিন্ট করতে পারে। ইনলাইন ফাংশনটি যেখানে এই ফাংশনটি কোডটিতে ব্যবহৃত হয়েছে সেখানে ফাংশনটির সম্পূর্ণ বডি toোকাতে সংকলককে নির্দেশ দিন।

সুবিধাদি :-

  1. এটির জন্য ফাংশন কলিং ওভারহেডের প্রয়োজন হয় না।

  2. এটি ফাংশন কল করার সময় স্ট্যাকের মধ্যে ভেরিয়েবলের ওভারহেড পুশ / পপ সংরক্ষণ করে।

  3. এটি কোনও ফাংশন থেকে রিটার্ন কলের ওভারহেড সংরক্ষণ করে।

  4. এটি নির্দেশের ক্যাশে ব্যবহার করে রেফারেন্সের স্থানীয়তা বৃদ্ধি করে।

  5. ইন-লাইনিং সংকলনের পরে নির্দিষ্ট করা থাকলে অন্তঃসারণমূলক অপ্টিমাইজেশন প্রয়োগ করতে পারে। এটি সর্বাধিক গুরুত্বপূর্ণ, সংকলক এখন ডেড কোড নির্মূলকরণের দিকে মনোনিবেশ করতে পারে, শাখার পূর্বাভাস, আনয়ন ভেরিয়েবল নির্মূলকরণ ইত্যাদির উপর আরও বেশি চাপ দিতে পারে ..

এটি সম্পর্কে আরও যাচাই করতে এই লিঙ্কটি অনুসরণ করতে পারেন http://tajentersengar.blogspot.com/2010/03/ কি- is- inline- function- in- cc.html


4
1) এটি একটি পরামর্শ নয়, কোনও নির্দেশ নয় 2) কোডের আকার বৃদ্ধির কারণে এটি আরও বেশি ক্যাশে মিস করতে পারে যদি সাধারণভাবে ব্যবহৃত ফাংশনটি অনেকটা ইনলাইন করা হয়
ফ্লেক্সো

3
লিঙ্কটি কি আপনার ব্যক্তিগত ব্লগের শেষে রয়েছে? যদি এটি হয় তবে আপনার এটির মতো ঘোষণা করা উচিত, অন্যথায় এটি স্প্যামের মতো দেখাচ্ছে।
ফ্লেক্সো

6

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

রানটাইমের সময় লাইব্রেরিটি লোড করার উদ্দেশ্যে করা হলে এটি সমালোচনামূলক হতে পারে। এটি বাইনারি-সামঞ্জস্যপূর্ণ-সচেতন লাইব্রেরিগুলিতেও আঘাত করতে পারে। এই জাতীয় ক্ষেত্রে ইনলাইন ব্যবহার করবেন না।


@ জনসইয়েব: আমার উত্তরটি মনোযোগ সহকারে পড়ুন। আপনি যা বলেছেন তা সত্য, যখন আপনি একটি নির্বাহী নির্মাণ করছেন। কিন্তু inlineএকটি ভাগ করা লাইব্রেরি তৈরি করার সময় সংকলক কেবল এড়ানো যায় না !
ডক

4

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


অনেক
সংকলকও

4

inlineআপনাকে কোনও শিরোনামের #includeবিধি লঙ্ঘন না করে শিরোনাম ফাইলে একটি ফাংশন সংজ্ঞা এবং সেই শিরোলেখ ফাইলটি একাধিক উত্স ফাইলে রাখতে দেয়।


3

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

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

অন্তর্নিহিত এবং / বা অন্তর্ভুক্তিকে বাধ্য করার জন্য কোনও ম্যাক্রো সংজ্ঞায়িত করবেন? - কেবলমাত্র যখন আপনি কোডের একটি সমালোচনামূলক বিভাগের জন্য গতি বৃদ্ধিপ্রাপ্ত এবং প্রয়োজনীয় প্রমাণিত বৃদ্ধি পেয়ে থাকেন যা অ্যাপ্লিকেশনটির সামগ্রিক কর্মক্ষমতাকে প্রভাবিত করে বলে জানা যায়।


... আপনি স্থান যত্নশীল পারেন, স্পেসের জন্য নিখুত কম্পাইলার বলতে - জন্য নিখুত কম্পাইলার কহন গতি হতে পারে ছোট একভাবে সি সঙ্গে বাইনেরিতে ++ এবং সি, স্থান জন্য নিখুত কম্পাইলার কহন দ্রুত সঞ্চালনের হতে পারে। iow, এই বৈশিষ্ট্যগুলি সর্বদা বিজ্ঞাপন হিসাবে কাজ করে না। সংকলকের সাধারণীকরণের ব্যাখ্যার (যা এছাড়াও ব্যবহারযোগ্যভাবে দ্রুত থাকতে হবে) এর চেয়ে মনুষ্যগণ তাদের প্রোগ্রামের কিছু দিক বোঝার ক্ষমতা রাখেন। মানুষের হস্তক্ষেপ খারাপ জিনিস হতে হবে না।
জাস্টিন

3

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


1

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


1

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


1

আমাদের কম্পিউটার বিজ্ঞানের অধ্যাপক আমাদের সি -++ প্রোগ্রামে কখনই ইনলাইন ব্যবহার না করার জন্য অনুরোধ করেছিলেন। কেন জিজ্ঞাসা করা হলে, তিনি দয়া করে আমাদের ব্যাখ্যা করেছিলেন যে আধুনিক সংকলকগণ কখন স্বয়ংক্রিয়ভাবে ইনলাইন ব্যবহার করবেন তা সনাক্ত করা উচিত।

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


5
আপনার অধ্যাপক দুর্ভাগ্যক্রমে সম্পূর্ণ ভুল। inlineসি ++ এ দুটি অত্যন্ত স্বতন্ত্র অর্থ রয়েছে - সেগুলির মধ্যে একটি মাত্র অপ্টিমাইজেশনের সাথে সম্পর্কিত, এবং আপনার প্রফেসর এর সাথে সঠিক। তবে ওয়ান ডেফিনিশন রুলটিinline সন্তুষ্ট করার জন্য প্রায়শই দ্বিতীয় অর্থটির প্রয়োজন হয় ।
কনরাড রুডলফ

-1

এখানে অন্য একটি আলোচনা থেকে উপসংহার :

ইনলাইন ফাংশনগুলির সাথে কোনও ত্রুটি রয়েছে?

স্পষ্টতই, ইনলাইন ফাংশনগুলি ব্যবহার করে কোনও ভুল নেই।

তবে এটি নীচের বিষয়গুলি লক্ষ্য করার মতো!

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

  • ফাংশন আকারে বাড়ার সাথে সাথে ইনলাইন ফাংশনের গতির সুবিধা হ্রাস পেতে থাকে। কোনও সময়ে ফাংশন বডিটির সঞ্চালনের তুলনায় ফাংশন কলের ওভারহেড ছোট হয়ে যায় এবং সুবিধাটি হারাতে থাকে - উত্স

  • কিছু পরিস্থিতি রয়েছে যেখানে কোনও ইনলাইন ফাংশন কাজ না করতে পারে:

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


3
সত্য হবে যদি ইনলাইনটি একটি আদেশ ছিল এবং সংকলকটির জন্য কোনও ইঙ্গিত ছিল না। সংকলক আসলে কী ইনলাইন করতে হবে তা স্থির করে।
মার্টিন ইয়র্ক 21

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

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