আমি জানি যে ইনলাইন হ'ল সংকেত বা সংকলন করার অনুরোধ এবং এটির ফাংশন কল ওভারহেডগুলি এড়াতে এর ব্যবহৃত used
সুতরাং কোন ভিত্তিতে একটি নির্ধারণ করতে পারে যে কোনও ফাংশন ইনলাইনিংয়ের প্রার্থী কিনা? কোন ক্ষেত্রে ইনলাইনিং এড়ানো উচিত?
আমি জানি যে ইনলাইন হ'ল সংকেত বা সংকলন করার অনুরোধ এবং এটির ফাংশন কল ওভারহেডগুলি এড়াতে এর ব্যবহৃত used
সুতরাং কোন ভিত্তিতে একটি নির্ধারণ করতে পারে যে কোনও ফাংশন ইনলাইনিংয়ের প্রার্থী কিনা? কোন ক্ষেত্রে ইনলাইনিং এড়ানো উচিত?
উত্তর:
কোনও ফাংশন কলের দাম এড়ানো কেবল গল্পের অর্ধেক।
একটি করুন:
inlineপরিবর্তে ব্যবহার করুন#defineinline: দ্রুত কোড এবং ছোট এক্সিকিউটেবল (কোড ক্যাশে থাকার আরও সম্ভাবনা)না:
একটি পাঠাগার বিকাশ করার সময়, ভবিষ্যতে আপনার ক্লাসকে এক্সটেনসিবল করার জন্য আপনার উচিত:
মনে রাখবেন 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 দ্বারা সংজ্ঞায়িত ইনলাইন ফাংশনগুলির জন্য অন্যান্য বিধিগুলি এখনও সম্মানিত হবে।
inlineসংকলকটির ইঙ্গিতের চেয়ে অনেক বেশি। এটি একাধিক সংজ্ঞা সম্পর্কে ভাষার নিয়মকে পরিবর্তন করে। এছাড়াও, কোনও ফাংশনটি অন্তর্ভুক্ত করা এড়াতে স্থির ডেটা থাকা কোনও ironালাই লোহার কারণ নয়। বাস্তবায়নটি প্রতিটি ফাংশন স্থির জন্য একটি একক স্ট্যাটিক অবজেক্ট বরাদ্দ করতে বাধ্য হয় যদি ফাংশনটি ঘোষিত হয় inlineবা না হয় declared ক্লাসগুলি এখনও ইনটেনসিবল যদি তাদের ইনলাইন কনস্ট্রাক্টর এবং ভার্চুয়াল ডেস্ট্রাক্টর থাকে। এবং খালি ব্রেস ডেস্ট্রাক্টর হ'ল এক ভার্চুয়াল ফাংশন যা কখনও কখনও ইনলাইন ছেড়ে যাওয়া ভাল ধারণা।
inline, ফলাফলটি ফাংশনটি অন্তর্ভুক্ত হয় না: আপনি কলটির জন্য মূল্য এবং প্রতিটি অনুবাদ ইউনিট যাতে ফাংশন অন্তর্ভুক্ত থাকে এবং কল করে তা কোড এবং স্ট্যাটিক ভেরিয়েবলগুলির নিজস্ব অনুলিপি পায়। লাইব্রেরি বিকাশের সময় কনস্ট্রাক্টর এবং ডেস্ট্রাক্টরগুলিকে
inlineসংকলকটি এটির মতো অনুভূত হলে অ- কার্যকারিতা অন্তর্ভুক্ত করা যেতে পারে। এবং inlineক্রিয়াকলাপগুলি ইনলাইন করা যাবে না যদি সংকলক সিদ্ধান্ত নেয়। চার্লস বেইলি যেমন বলেছিলেন, এটি ভাষার নিয়মগুলিকে পরিবর্তন করে। একে অপ্টিমাইজেশনের ইঙ্গিত হিসাবে ভাবার পরিবর্তে একে সম্পূর্ণ আলাদা ধারণা হিসাবে ভাবা আরও সঠিক। inlineশব্দ একাধিক সংজ্ঞা করার অনুমতি কম্পাইলার, এবং অন্য কিছুই বলে। "ইনলাইনিং" অপ্টিমাইজেশন চিহ্নিত করা আছে কিনা তা প্রায় কোনও ফাংশনে প্রয়োগ করা যেতে পারে inline।
inlineফাংশন ইনলাইনিং পেতে আমরা সবাই ব্যবহার করি না । কখনও কখনও আমরা অন্যান্য সুবিধাগুলি যেমন ওডিআরের কাছাকাছি পেতে চাই।
inlineঅপ্টিমাইজেশনের সাথে খুব কম করার আছে। inlineসংকলনকারীকে একটি নির্দেশনা দেওয়া হয় যে প্রোগ্রামে একাধিকবার প্রদত্ত ফাংশন দেওয়া হয়েছে এবং একটি প্রতিশ্রুতি রয়েছে যে এটি ব্যবহৃত প্রতিটি অনুবাদে সংজ্ঞাটি আসবে এবং যেখানেই প্রদর্শিত হবে না কেন ঠিক একই সংজ্ঞা থাকবে।
উপরোক্ত নিয়মগুলি দেওয়া, inlineসংক্ষিপ্ত ফাংশনগুলির জন্য উপযুক্ত , যার দেহ কেবলমাত্র কোনও ঘোষণার দরকার হয় তার চেয়ে অতিরিক্ত নির্ভরতা সহ itate প্রতিবার সংজ্ঞাটি পড়ার পরে অবশ্যই এটি অবশ্যই বিশ্লেষণ করতে হবে এবং এর দেহের জন্য কোড তৈরি করা যেতে পারে তাই এটি কোনও একক উত্স ফাইলে কেবল একবার সংজ্ঞায়িত ফাংশনটির উপরে কিছু সংকলক ওভারহেড বোঝায়।
একটি সংকলক ইনলাইন করতে পারে (যেমন সেই ফাংশনের যে ক্রিয়াটি সম্পাদন করে এমন কোডের সাথে ফাংশনে একটি কলকে প্রতিস্থাপন করবে) যে কোনও ফাংশন কল এটি চয়ন করে। এটি এমনটি হয়েছিল যে এটি "স্পষ্টতই" কোনও ফাংশনটি ইনলাইন করতে পারে না যা কল হিসাবে একই অনুবাদ ইউনিটে ঘোষিত হয়নি তবে লিঙ্ক টাইম অপ্টিমাইজেশনের ক্রমবর্ধমান ব্যবহারের সাথে এমনকি এটি এখন সত্য নয়। একইভাবে সত্য যে চিহ্নিত ফাংশনগুলি অন্তর্ভুক্ত inlineনাও হতে পারে।
inlineকীওয়ার্ডের সাথে কি সম্পর্কযুক্ত ? এবং একটি সুখী কাকতালীয় কি?
সংস্থাপকটিকে কোনও ফাংশনটি ইনলাইন করতে বলা একটি অপ্টিমাইজেশন এবং অপ্টিমাইজেশনের সবচেয়ে গুরুত্বপূর্ণ নিয়ম হ'ল অকালীন অপটিমাইজেশন হ'ল সমস্ত মন্দের মূল। সর্বদা পরিষ্কার কোড লিখুন (দক্ষ অ্যালগরিদম ব্যবহার করে), তারপরে আপনার প্রোগ্রামটির প্রোফাইল দিন এবং কেবলমাত্র খুব বেশি সময় নিচ্ছে এমন ফাংশনগুলিকে অনুকূল করুন ize
যদি আপনি কোনও নির্দিষ্ট ফাংশনটি খুব সংক্ষিপ্ত এবং সাধারণ দেখেন এবং একটি শক্ত অভ্যন্তরীণ লুপে এটি কয়েক হাজার বার বলা হয়ে থাকে তবে এটি একটি ভাল প্রার্থী হতে পারে।
আপনি অবাক হতে পারেন, যদিও - অনেক সি ++ সংকলক স্বয়ংক্রিয়ভাবে আপনার জন্য ছোট ফাংশনগুলি ইনলাইন করবে - এবং তারা আপনার ইনলাইন করার অনুরোধটিকেও এড়িয়ে যেতে পারে।
/FAcsসাথে ভিজ্যুয়াল স্টুডিওতে, -sজিসিসিতে) অ্যাসেম্বলি ভাষা নির্গত করতে সংকলকটি সেট করতে পারেন । আমার অভিজ্ঞতায়, এই দুটি সংকলকই ইনলাইন কীওয়ার্ডটি বেশ ভারী করে ওজন করে।
inlineকীওয়ার্ডটি মোটেও ওজন করে না। এটি হ'ল, যদি আপনি দেখতে পান যে ফাংশনটি ইনলাইন করা হচ্ছে, এবং inlineএটির থেকে সুনির্দিষ্ট অপসারণ করুন , এটি এখনও ইনলাইনড হয়ে যাবে। যদি আপনার বিপরীতে কোনও নির্দিষ্ট উদাহরণ থাকে তবে দয়া করে সেগুলি ভাগ করুন!
inlineশব্দ পিছনের "স্পষ্ট কোড"? "অকাল অপটিমাইজেশন" এর মূল শব্দটি অকাল , অপটিমাইজেশন নয় । আপনার সক্রিয়ভাবে * অপ্টিমাইজেশান এড়ানো উচিত বলা কেবল আবর্জনা। এই উক্তির মূল বক্তব্যটি হ'ল আপনার প্রয়োজনীয় অপটিমাইজেশনগুলি এড়ানো উচিত এবং কোডটিতে ক্ষতিকারক পার্শ্ব প্রতিক্রিয়া থাকতে হবে (যেমন এটিকে কম রক্ষণাবেক্ষণযোগ্য করে তোলা)। inlineকীওয়ার্ডটি কীভাবে কোডটি কম রক্ষণাবেক্ষণযোগ্য করে তুলছে বা কীভাবে এটি কোনও কার্যক্রমে যুক্ত করা ক্ষতিকারক হতে পারে তা দেখতে আমি ব্যর্থ হয়েছি ।
সন্ধানের সর্বোত্তম উপায় হ'ল আপনার প্রোগ্রামটি প্রোফাইল করা এবং ছোট ফাংশনগুলিকে চিহ্নিত করা যা প্রচুর সময় বলা হয় এবং সিপিইউ চক্রের মাধ্যমে বার্ন হয় inline। এখানে মূলশব্দটি "ছোট" - ফাংশনে ব্যয় করা সময়ের তুলনায় ফাংশন কল ওভারহেড একবার নগণ্য হয়ে যায়, সেগুলি ইনলাইন করা অর্থহীন।
অন্যান্য ব্যবহারের পরামর্শ আমি দিচ্ছি যদি আপনি ছোট ক্রিয়াকলাপগুলি পেয়ে থাকেন যা পারফরম্যান্সের সমালোচনামূলক কোড হিসাবে প্রায়শই একটি ক্যাশে মিস প্রাসঙ্গিক করতে যথেষ্ট হয়, আপনার সম্ভবত সেগুলিও ইনলাইন করা উচিত। আবার, এটি এমন কিছু যা প্রোফাইলর আপনাকে বলতে সক্ষম হবেন।
অকালীন অপটিমাইজেশন হ'ল সমস্ত অশুভের মূল!
থাম্বের নিয়ম হিসাবে আমি সাধারণত কেবল "গেটার" এবং "সেটটার" ইনলাইন করি। কোডটি কাজ করার পরে এবং স্থিতিশীল হয়ে গেলে, প্রোফাইলিংটি দেখায় যে কোন ফাংশনগুলি ইনলাইনিংয়ের মাধ্যমে উপকৃত হতে পারে।
অন্যদিকে, বেশিরভাগ আধুনিক সংকলকগুলির মধ্যে বেশ ভাল অপ্টিমাইজেশন অ্যালগরিদম রয়েছে এবং আপনার জন্য কী সন্নিবেশ করা উচিত তা ইনলাইন করবে।
পুনঃসূচনা করা - ইনলাইন ওয়ান-লাইনার ফাংশন লিখুন এবং পরে অন্যদের নিয়ে উদ্বেগ প্রকাশ করুন।
ইনলাইন ফাংশনগুলি স্ট্যাকের মধ্যে আর্গুমেন্টগুলি ধাক্কা দেওয়ার প্রয়োজনীয়তা বাদ দিয়ে আপনার কোডের কার্যকারিতা উন্নত করতে পারে । যদি প্রশ্নে থাকা ফাংশনটি আপনার কোডের সমালোচনামূলক অংশে থাকে তবে আপনার প্রকল্পের অপ্টিমাইজেশনের অংশে ইনলাইন সিদ্ধান্ত নেওয়া উচিত নয়,
আপনি সি ++ ফ্যাক্সের ইনলাইনগুলি সম্পর্কে আরও পড়তে পারেন
আমি প্রায়শই ইনলাইন ফাংশনগুলি অপটিমাইজেশন হিসাবে ব্যবহার করি না তবে কোডটি আরও পাঠযোগ্য। কখনও কখনও কোড নিজেই মন্তব্য, বর্ণনামূলক নাম ইত্যাদির চেয়ে সংক্ষিপ্ত এবং বুঝতে সহজ হয় উদাহরণস্বরূপ:
void IncreaseCount() { freeInstancesCnt++; }
পাঠক তাত্ক্ষণিকভাবে কোডটির সম্পূর্ণ শব্দার্থবিজ্ঞান জেনে রাখবেন।
আমি সাধারণত একটি থাম্ব নিয়ম অনুসরণ করি যেখানে আমি ইনলাইন হিসাবে 3-4 সাধারণ বিবৃতি দিয়ে একটি ফাংশন করি। তবে এটি মনে রাখা ভাল যে এটি কম্পাইলারের কাছে কেবল একটি ইঙ্গিত। এটি ইনলাইন করা বা না করতে চূড়ান্ত কলটি কেবল সংকলক গ্রহণ করে। যদি এইরকম অনেক বক্তব্যের বেশি থাকে তবে আমি কোনও বোকা সংকলক হিসাবে ইনলাইনটি ঘোষণা করব না এটি কোড ফুলে যেতে পারে।
ইনলাইনটি ব্যবহার করবেন কিনা সে সম্পর্কে সিদ্ধান্ত নেওয়ার সময়, আমি সাধারণত নিম্নলিখিত ধারণাটি মাথায় রাখি: আধুনিক মেশিনে মেমরি বিলম্বিতা কাঁচা গণনার চেয়ে বড় বাধা হতে পারে। ইনলাইনিং ফাংশন যা প্রায়শই বলা হয় এক্সিকিউটেবল আকার বাড়ানোর জন্য পরিচিত। তদুপরি, এই জাতীয় ফাংশন সিপিইউ কোড কোডে সংরক্ষণ করা যেতে পারে যা সেই কোডটি অ্যাক্সেস করার প্রয়োজন হলে ক্যাশে মিস করার সংখ্যা হ্রাস পাবে।
অতএব, আপনাকে নিজেরাই সিদ্ধান্ত নিতে হবে: ইনলাইনিং উত্পন্ন মেশিন কোডটির আকার বাড়ায় বা হ্রাস করে? ফাংশনটি কল করা ক্যাশে মিস করার সম্ভাবনা কতটা সম্ভবত? যদি কোডে এটি জুড়ে থাকে তবে আমি বলব সম্ভাবনা বেশি। যদি এটি একটি একক টান লুপের মধ্যে সীমাবদ্ধ থাকে তবে সম্ভাবনাটি কম।
আমি সাধারণত নমুনা তালিকাভুক্ত ক্ষেত্রে ইনলাইনিং ব্যবহার করি। তবে যেখানে আপনি পারফরম্যান্স সম্পর্কে সত্যই উদ্বিগ্ন, সেখানে প্রোফাইলিং অপরিহার্য। তদুপরি, আপনি কম্পাইলারটি আসলে ইঙ্গিতটি গ্রহণ করে কিনা তা পরীক্ষা করে দেখতে চাইতে পারেন।
এছাড়াও, বড় প্রকল্পগুলি বজায় রাখার সময় একটি ইনলাইন পদ্ধতিতে মারাত্মক পার্শ্ব প্রতিক্রিয়া হয়। যখন ইনলাইন কোডটি পরিবর্তন করা হয়, সমস্ত ফাইল যা এটি ব্যবহার করে তা স্বয়ংক্রিয়ভাবে সংকলক দ্বারা পুনর্নির্মাণ করা হবে (এটি একটি ভাল সংকলক)। এটি আপনার বিকাশের অনেক সময় নষ্ট করতে পারে।
কোনও inlineপদ্ধতি যখন কোনও উত্স ফাইলে স্থানান্তরিত হয় এবং আর কোনও ইনলাইন করা না হয়, পুরো প্রকল্পটি অবশ্যই পুনর্নির্মাণ করতে হবে (কমপক্ষে এটি আমার অভিজ্ঞতা হয়েছে)। এবং পদ্ধতিগুলি যখন ইনলাইনে রূপান্তরিত হয় তখনও।
inlineবা না ব্যাপার (ছাড়া ছাড়া অন্য না inlineকীওয়ার্ডটি আপনি linker ত্রুটি পাবেন - কিন্তু inlineশব্দ ইস্যু অত্যধিক পুনঃনির্মাণ ঘটাচ্ছে নয়।
আপনি যখন মনে করেন যে আপনার কোডটি যথেষ্ট পরিমাণে ইনলাইন হিসাবে ব্যবহার করা যায় এবং আপনার কোডটিকে অনুলিপি করে মনে করে যে আপনার কোডটি নকল করে পেস্ট করে তখন এটি ফাংশন বলে execution তাই এটি কার্যকর হওয়ার সময় বাড়াতে পারে তবে মেমরির খরচও বাড়িয়েছিল। আপনি যখন লুপ / স্ট্যাটিক ভেরিয়েবল / পুনরাবৃত্ত / সুইচ / গোটো / ভার্চুয়াল ফাংশন ব্যবহার করছেন তখন আপনি ইনলাইন ফাংশনটি ব্যবহার করতে পারবেন না। ভার্চুয়াল মানে রানটাইম অবধি অপেক্ষা করা এবং সংকলনের সময় ইনলাইন মানে যাতে সেগুলি একসাথে ব্যবহার করা যায় না।
আমি কিছু উত্তর পড়েছি এবং দেখতে পাচ্ছি যে এখানে কিছু জিনিস নেই।
আমি যে নিয়মটি ব্যবহার করি তা হ'ল ইনলাইন ব্যবহার করা নয়, যদি না আমি এটি ইনলাইন করতে চাই। নির্বোধ দেখাচ্ছে, এখন ব্যাখ্যা।
সংকলকগুলি যথেষ্ট স্মার্ট এবং সংক্ষিপ্ত ফাংশন সর্বদা ইনলাইন করে তোলে। এবং প্রোগ্রামাররা এটি না করতে না বললে কখনও ইনলাইন হিসাবে দীর্ঘ ফাংশন করে না।
আমি জানি যে ইনলাইন হ'ল ইঙ্গিত বা সংকলনের অনুরোধ
প্রকৃতপক্ষে inlineসংকলকের জন্য একটি আদেশ, এর কোনও পছন্দ নেই এবং inlineকীওয়ার্ডের পরে সমস্ত কোড ইনলাইন করে। সুতরাং আপনি inlineকীওয়ার্ডটি কখনই ব্যবহার করতে পারবেন না এবং সংকলক সংক্ষিপ্ততম কোডটি ডিজাইন করবে।
তাহলে কখন ব্যবহার করবেন inline?
আপনি যদি কিছু কোড ইনলাইন রাখতে চান তবে ব্যবহার করতে। আমি কেবল একটি উদাহরণ জানি, কারণ আমি এটি শুধুমাত্র একটি পরিস্থিতিতে ব্যবহার করি। এটি ব্যবহারকারীর প্রমাণীকরণ।
উদাহরণস্বরূপ আমার এই ফাংশনটি রয়েছে:
inline bool ValidUser(const std::string& username, const std::string& password)
{
//here it is quite long function
}
এই ফাংশনটি যতই বড় হোক না কেন আমি এটিকে ইনলাইন হিসাবে রাখতে চাই কারণ এটি আমার সফ্টওয়্যারটিকে ক্র্যাক করা শক্ত করে তোলে।
inlineCFLAGSজেন্টু নবাগত আগতদের সি -++ আগতদের জন্য: কোনটি দিয়ে সংকলন করা-O3 -funroll-loops -finline-functionsআপনার পুরানো পেন্টিয়াম উড়বে না;)