কখন ইনলাইন ফাংশন ব্যবহার করবেন এবং কখন ব্যবহার করবেন না?


184

আমি জানি যে ইনলাইন হ'ল সংকেত বা সংকলন করার অনুরোধ এবং এটির ফাংশন কল ওভারহেডগুলি এড়াতে এর ব্যবহৃত used

সুতরাং কোন ভিত্তিতে একটি নির্ধারণ করতে পারে যে কোনও ফাংশন ইনলাইনিংয়ের প্রার্থী কিনা? কোন ক্ষেত্রে ইনলাইনিং এড়ানো উচিত?


11
inlineCFLAGSজেন্টু নবাগত আগতদের সি -++ আগতদের জন্য: কোনটি দিয়ে সংকলন করা -O3 -funroll-loops -finline-functionsআপনার পুরানো পেন্টিয়াম উড়বে না;)
গ্রেগরি পাকোস্জ

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


5
কোনও ক্রিয়াকলাপটি ইনলাইন করা উচিত কিনা তা আপনাকে নির্ধারণ করা উচিত নয়। সংকলক এটি করতে দিন; এটি আপনার চেয়ে আরও ভাল (এবং প্রতিটি কলের পরিবেশের উপর ভিত্তি করে ফাংশনগুলি ইনলাইন করতে পারে)।
ডেভিড থর্নলি

@ ডেভিডথর্নলি কখনও কখনও, এমনকি ও 3 পতাকা সেট সহ, সংজ্ঞাটি সিপিপি ফাইলে থাকলে ফাংশনটিকে ইনলাইন করে না। সুতরাং, আমি যে থাম্ব নিয়মটি অনুসরণ করি তা হ'ল একটি লাইনার ইনলাইন করা এবং কোনও লুপ ছাড়াই functions ফাংশনগুলি।
টেল্কডস্কোবিডা

উত্তর:


209

কোনও ফাংশন কলের দাম এড়ানো কেবল গল্পের অর্ধেক।

একটি করুন:

  • inlineপরিবর্তে ব্যবহার করুন#define
  • খুব ছোট ফাংশনগুলি এর জন্য ভাল প্রার্থী inline: দ্রুত কোড এবং ছোট এক্সিকিউটেবল (কোড ক্যাশে থাকার আরও সম্ভাবনা)
  • ফাংশনটি ছোট এবং খুব প্রায়শই বলা হয়

না:

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

একটি পাঠাগার বিকাশ করার সময়, ভবিষ্যতে আপনার ক্লাসকে এক্সটেনসিবল করার জন্য আপনার উচিত:

  • শরীর খালি থাকলেও নন-ইনলাইন ভার্চুয়াল ডেস্ট্রাক্টর যুক্ত করুন
  • সমস্ত কনস্ট্রাক্টরকে নন-ইনলাইন করুন
  • কপি নির্মাণকারী এবং অ্যাসাইনমেন্ট অপারেটরের নন-ইনলাইন প্রয়োগগুলি লিখুন যদি না ক্লাসটি মান দ্বারা অনুলিপি করা যায়

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

কর্মক্ষমতা সম্পর্কে, বুদ্ধিমান পন্থাটি (সর্বদা হিসাবে) অ্যাপ্লিকেশনটির প্রোফাইল করা হয়, তারপরে অবশেষে inlineএকটি বাধাটি প্রতিনিধিত্ব করে একটি ক্রিয়াকলাপ।

তথ্যসূত্র:


সম্পাদনা: বজরান স্ট্রাস্ট্রাপ, সি ++ প্রোগ্রামিং ভাষা:

একটি ফাংশন হতে সংজ্ঞায়িত করা যেতে পারে inline। উদাহরণ স্বরূপ:

inline int fac(int n)
{
  return (n < 2) ? 1 : n * fac(n-1);
}

inlineসুনির্দিষ্টভাবে উল্লেখ করা কম্পাইলার করার জন্য একটি ইঙ্গিতটি যে এটি একটি কলের জন্য কোড জেনারেট করতে প্রচেষ্টা উচিত fac()একবার ফাংশন কোড নিচে ডিম্বপ্রসর এবং তারপর স্বাভাবিক ফাংশন কল প্রক্রিয়া মাধ্যমে কলিং চেয়ে ইনলাইন বরং। একটি চতুর সংকলক 720একটি কল জন্য ধ্রুবক উত্পাদন করতে পারে fac(6)। পারস্পরিক পুনরাবৃত্ত ইনলাইন ফাংশন, ইনলাইন ফাংশনগুলি যা ইনপুট ইত্যাদির উপর নির্ভর করে পুনরাবৃত্তি করে বা না করে, এর সম্ভাবনা কোনও inlineফাংশনের প্রতিটি কল প্রকৃতপক্ষে অন্তর্নিহিত রয়েছে তা গ্যারান্টি দেওয়া অসম্ভব করে তোলে । সংকলকটির চৌকসতার ডিগ্রিকে আইনীকরণ করা যায় না, সুতরাং একটি সংকলক তৈরি করতে পারে 720, অন্যটি 6 * fac(5)এবং অন্যটি অন-ইনলাইনড কল fac(6)

অস্বাভাবিকভাবে চতুর সংকলন এবং সংযোগ স্থাপনের সুবিধার অভাবে ইনলাইনিংকে সম্ভব করার জন্য, একটি ইনলাইন ফাংশনটির সংজ্ঞা এবং কেবলমাত্র ঘোষণা নয় scope অবশ্যই স্কোপে (.2৯.২) থাকতে হবে। কোনও inlineস্পেসিফায়ার কোনও ফাংশনের শব্দার্থকে প্রভাবিত করে না। বিশেষত, একটি ইনলাইন ফাংশনটির এখনও একটি অনন্য ঠিকানা রয়েছে এবং তাই staticকোনও ইনলাইন ফাংশনের ভেরিয়েবল (§7.1.2) রয়েছে।

EDIT2: আইএসও-আইসিসি 14882-1998, 7.1.2 ফাংশন নির্দিষ্টকারী

একটি inlineনির্দিষ্টকরণকারী সহ একটি ফাংশন ঘোষণা (8.3.5, 9.3, 11.4) একটি ইনলাইন ফাংশন ঘোষণা করে। ইনলাইন স্পেসিফায়ার প্রয়োগের দিকে ইঙ্গিত করে যে কল করার সময় ফাংশন বডির ইনলাইন প্রতিস্থাপনটি সাধারণ ফাংশন কল ব্যবস্থায় অগ্রাধিকার দেওয়া হয়। কল করার পয়েন্টে এই ইনলাইন প্রতিস্থাপন সম্পাদনের জন্য কোনও প্রয়োগের প্রয়োজন হয় না; তবে, এই ইনলাইন বিকল্পটি বাদ দেওয়া হলেও, 7.1.2 দ্বারা সংজ্ঞায়িত ইনলাইন ফাংশনগুলির জন্য অন্যান্য বিধিগুলি এখনও সম্মানিত হবে।


34
inlineসংকলকটির ইঙ্গিতের চেয়ে অনেক বেশি। এটি একাধিক সংজ্ঞা সম্পর্কে ভাষার নিয়মকে পরিবর্তন করে। এছাড়াও, কোনও ফাংশনটি অন্তর্ভুক্ত করা এড়াতে স্থির ডেটা থাকা কোনও ironালাই লোহার কারণ নয়। বাস্তবায়নটি প্রতিটি ফাংশন স্থির জন্য একটি একক স্ট্যাটিক অবজেক্ট বরাদ্দ করতে বাধ্য হয় যদি ফাংশনটি ঘোষিত হয় inlineবা না হয় declared ক্লাসগুলি এখনও ইনটেনসিবল যদি তাদের ইনলাইন কনস্ট্রাক্টর এবং ভার্চুয়াল ডেস্ট্রাক্টর থাকে। এবং খালি ব্রেস ডেস্ট্রাক্টর হ'ল এক ভার্চুয়াল ফাংশন যা কখনও কখনও ইনলাইন ছেড়ে যাওয়া ভাল ধারণা।
সিবি বেইলি

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

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

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

2
@ গ্রেগরিপাকোসজ: তবে inlineফাংশন ইনলাইনিং পেতে আমরা সবাই ব্যবহার করি না । কখনও কখনও আমরা অন্যান্য সুবিধাগুলি যেমন ওডিআরের কাছাকাছি পেতে চাই।
অরবিটে হালকা ঘোড়দৌড়

57

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

উপরোক্ত নিয়মগুলি দেওয়া, inlineসংক্ষিপ্ত ফাংশনগুলির জন্য উপযুক্ত , যার দেহ কেবলমাত্র কোনও ঘোষণার দরকার হয় তার চেয়ে অতিরিক্ত নির্ভরতা সহ itate প্রতিবার সংজ্ঞাটি পড়ার পরে অবশ্যই এটি অবশ্যই বিশ্লেষণ করতে হবে এবং এর দেহের জন্য কোড তৈরি করা যেতে পারে তাই এটি কোনও একক উত্স ফাইলে কেবল একবার সংজ্ঞায়িত ফাংশনটির উপরে কিছু সংকলক ওভারহেড বোঝায়।

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


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

+1 টি। @ রেহনো: আপনি কী বলছেন তা আমি সত্যিই নিশ্চিত নই। লিঙ্কেজ inlineকীওয়ার্ডের সাথে কি সম্পর্কযুক্ত ? এবং একটি সুখী কাকতালীয় কি?
জলফ

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

4
আপনার মন্তব্য কেন এত বেশি ভোট পেয়েছে তা নিশ্চিত নয়, যেহেতু ইনলাইন ব্যবহারের জন্য পারফরম্যান্সই প্রভাবশালী কারণ।
gast128

10

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

যদি আপনি কোনও নির্দিষ্ট ফাংশনটি খুব সংক্ষিপ্ত এবং সাধারণ দেখেন এবং একটি শক্ত অভ্যন্তরীণ লুপে এটি কয়েক হাজার বার বলা হয়ে থাকে তবে এটি একটি ভাল প্রার্থী হতে পারে।

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


আসলে আমার সন্দেহ আছে যে নির্দিষ্ট সংকলক খুব স্পষ্টভাবে 'ইনলাইন' উপেক্ষা করে কেবল '__inline' বা '__for_inline' তে সাড়া দেয়। আমি মনে করি এটি অপব্যবহার রোধ করার জন্য!
রেহনো লিন্ডেক

সাধারণত ক্ষেত্রে হয় না। ইনলাইন কেবল একটি ইঙ্গিত, তবে এটি বেশিরভাগ সংকলক গুরুত্ব সহকারে নেয় a এটি ঠিক কী করে তা দেখতে আপনি বস্তু কোডের /FAcsসাথে ভিজ্যুয়াল স্টুডিওতে, -sজিসিসিতে) অ্যাসেম্বলি ভাষা নির্গত করতে সংকলকটি সেট করতে পারেন । আমার অভিজ্ঞতায়, এই দুটি সংকলকই ইনলাইন কীওয়ার্ডটি বেশ ভারী করে ওজন করে।
ক্রাশওয়ার্কস

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

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

3
জালফ, কখনও কখনও কোনও ফাংশনটি অন্তর্ভুক্ত করা আপনার কোডটিকে ধীর করে দেয়, দ্রুত নয়। একটি উদাহরণ যখন ফাংশনটি আপনার কোডের বিভিন্ন স্থান থেকে কল করা হয়; যদি ফাংশনটি অন্তর্ভুক্ত না করা হয়, তবে এটি অন্য স্থান থেকে ডাকার পরে নির্দেশের ক্যাশে থাকতে পারে এবং শাখার ভবিষ্যদ্বাণীটি ইতিমধ্যে উষ্ণ হয়ে উঠতে পারে। কিছু নিদর্শন রয়েছে যা সর্বদা দক্ষতা উন্নত করে, তাই এগুলি ব্যবহার করতে কখনই ব্যথা হয় না। ইনলাইনিং এর মধ্যে একটিও নয়। এটির কার্য সম্পাদনে সাধারণত প্রভাব পড়ে না, এটি কখনও কখনও সহায়তা করে এবং কখনও কখনও ব্যথা করে। আমি আমার পরামর্শের পিছনে দাঁড়িয়ে আছি: প্রোফাইলটি প্রথমে, তারপরে ইনলাইন করুন।
dmamazoni

5

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

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


4

অকালীন অপটিমাইজেশন হ'ল সমস্ত অশুভের মূল!

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

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

পুনঃসূচনা করা - ইনলাইন ওয়ান-লাইনার ফাংশন লিখুন এবং পরে অন্যদের নিয়ে উদ্বেগ প্রকাশ করুন।


2

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

আপনি সি ++ ফ্যাক্সের ইনলাইনগুলি সম্পর্কে আরও পড়তে পারেন


1

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

void IncreaseCount() { freeInstancesCnt++; }

পাঠক তাত্ক্ষণিকভাবে কোডটির সম্পূর্ণ শব্দার্থবিজ্ঞান জেনে রাখবেন।


0

আমি সাধারণত একটি থাম্ব নিয়ম অনুসরণ করি যেখানে আমি ইনলাইন হিসাবে 3-4 সাধারণ বিবৃতি দিয়ে একটি ফাংশন করি। তবে এটি মনে রাখা ভাল যে এটি কম্পাইলারের কাছে কেবল একটি ইঙ্গিত। এটি ইনলাইন করা বা না করতে চূড়ান্ত কলটি কেবল সংকলক গ্রহণ করে। যদি এইরকম অনেক বক্তব্যের বেশি থাকে তবে আমি কোনও বোকা সংকলক হিসাবে ইনলাইনটি ঘোষণা করব না এটি কোড ফুলে যেতে পারে।


0

সবচেয়ে ভাল উপায় হ'ল ইনলাইনড এবং ইনলাইন নয় এর জন্য উত্পন্ন নির্দেশাবলী পরীক্ষা করা এবং তুলনা করা। তবে এটি বাদ দেওয়া সর্বদা নিরাপদ inline। ব্যবহারের inlineফলে আপনি চান না এমন ঝামেলা হতে পারে।


0

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

অতএব, আপনাকে নিজেরাই সিদ্ধান্ত নিতে হবে: ইনলাইনিং উত্পন্ন মেশিন কোডটির আকার বাড়ায় বা হ্রাস করে? ফাংশনটি কল করা ক্যাশে মিস করার সম্ভাবনা কতটা সম্ভবত? যদি কোডে এটি জুড়ে থাকে তবে আমি বলব সম্ভাবনা বেশি। যদি এটি একটি একক টান লুপের মধ্যে সীমাবদ্ধ থাকে তবে সম্ভাবনাটি কম।

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

  • সংক্ষিপ্ত রুটিনগুলি যা একটি শক্ত লুপে ডাকা হয়।
  • খুব বেসিক অ্যাক্সেসর (পান / সেট) এবং মোড়ক ফাংশন।
  • শিরোনাম ফাইলগুলিতে টেম্পলেট কোড দুর্ভাগ্যক্রমে স্বয়ংক্রিয়ভাবে ইনলাইন ইঙ্গিতটি গ্রহণ করে।
  • সংক্ষিপ্ত কোড যা ম্যাক্রোর মতো ব্যবহৃত হয়। (উদাহরণস্বরূপ মিনিট () / সর্বাধিক ()
  • সংক্ষিপ্ত গণিতের রুটিন

0

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

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


1
এটি একটি ভিন্ন ইস্যু। আপনি একটি শিরোলেখ ফাইলটিতে স্থাপন করা কোডের জন্য পুনর্নির্মাণ সমস্যা পান। হোক চিহ্নিত করা হয় inlineবা না ব্যাপার (ছাড়া ছাড়া অন্য না inlineকীওয়ার্ডটি আপনি linker ত্রুটি পাবেন - কিন্তু inlineশব্দ ইস্যু অত্যধিক পুনঃনির্মাণ ঘটাচ্ছে নয়।
jalf

তবে, একটি ইনলাইন পদ্ধতি পরিবর্তনের ফলে একটি উত্স-ফাইলগুলিতে একটি অন-ইনলাইন পদ্ধতি পরিবর্তন বনাম অতিরিক্ত বিল্ডস তৈরি হবে।
টমাস ম্যাথিউস

0

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


0

আপনি যখন মনে করেন যে আপনার কোডটি যথেষ্ট পরিমাণে ইনলাইন হিসাবে ব্যবহার করা যায় এবং আপনার কোডটিকে অনুলিপি করে মনে করে যে আপনার কোডটি নকল করে পেস্ট করে তখন এটি ফাংশন বলে execution তাই এটি কার্যকর হওয়ার সময় বাড়াতে পারে তবে মেমরির খরচও বাড়িয়েছিল। আপনি যখন লুপ / ​​স্ট্যাটিক ভেরিয়েবল / পুনরাবৃত্ত / সুইচ / গোটো / ভার্চুয়াল ফাংশন ব্যবহার করছেন তখন আপনি ইনলাইন ফাংশনটি ব্যবহার করতে পারবেন না। ভার্চুয়াল মানে রানটাইম অবধি অপেক্ষা করা এবং সংকলনের সময় ইনলাইন মানে যাতে সেগুলি একসাথে ব্যবহার করা যায় না।


-2

আমি কিছু উত্তর পড়েছি এবং দেখতে পাচ্ছি যে এখানে কিছু জিনিস নেই।

আমি যে নিয়মটি ব্যবহার করি তা হ'ল ইনলাইন ব্যবহার করা নয়, যদি না আমি এটি ইনলাইন করতে চাই। নির্বোধ দেখাচ্ছে, এখন ব্যাখ্যা।

সংকলকগুলি যথেষ্ট স্মার্ট এবং সংক্ষিপ্ত ফাংশন সর্বদা ইনলাইন করে তোলে। এবং প্রোগ্রামাররা এটি না করতে না বললে কখনও ইনলাইন হিসাবে দীর্ঘ ফাংশন করে না।

আমি জানি যে ইনলাইন হ'ল ইঙ্গিত বা সংকলনের অনুরোধ

প্রকৃতপক্ষে inlineসংকলকের জন্য একটি আদেশ, এর কোনও পছন্দ নেই এবং inlineকীওয়ার্ডের পরে সমস্ত কোড ইনলাইন করে। সুতরাং আপনি inlineকীওয়ার্ডটি কখনই ব্যবহার করতে পারবেন না এবং সংকলক সংক্ষিপ্ততম কোডটি ডিজাইন করবে।

তাহলে কখন ব্যবহার করবেন inline?

আপনি যদি কিছু কোড ইনলাইন রাখতে চান তবে ব্যবহার করতে। আমি কেবল একটি উদাহরণ জানি, কারণ আমি এটি শুধুমাত্র একটি পরিস্থিতিতে ব্যবহার করি। এটি ব্যবহারকারীর প্রমাণীকরণ।

উদাহরণস্বরূপ আমার এই ফাংশনটি রয়েছে:

inline bool ValidUser(const std::string& username, const std::string& password)
{
    //here it is quite long function
}

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


2
ইনলাইন এখনও একটি ইঙ্গিত। আপনার ফাংশনটি খুব প্রস্ফুটিত হয়েছে বলে মনে করে সংকলক ইনলাইন করতে ব্যর্থ হতে পারে।
ইটপিট

একজন বলেছেন ইনলাইন একটি অর্ডার ... অন্যটি তার ইঙ্গিতটি বলেছে কেউ কি তার বক্তব্যকে সমর্থন করবে যাতে আমরা নির্ধারণ করতে পারি কোনটি সত্য?

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