টেমপ্লেটগুলির সাথে ইনলাইন কীওয়ার্ডটি ব্যবহার করার কোনও অর্থ আছে?


119

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


সম্পাদনা: আমি উভয় উত্তর গ্রহণ করতে চাই, তবে এটি সম্ভব নয়। ইস্যু আমি গ্রহণ করছি বন্ধ করতে phresnel এর উত্তর, কারণ এটি সবচেয়ে ভোট পেয়েছে এবং তিনি আনুষ্ঠানিকভাবে অধিকার, কিন্তু আমি মন্তব্য উল্লেখ আমার বিবেচনায় পাপী 's এবং কম্পোনেন্ট 10 খুব সঠিক বেশী হিসাবে এর উত্তর, দেখুন বিভিন্ন পয়েন্ট থেকে ।

সমস্যাটি সি ++ শব্দার্থবিজ্ঞানের, যা inlineকীওয়ার্ড এবং ইনলাইনিংয়ের ক্ষেত্রে কঠোর নয় । phresnel "লেখ ইনলাইন যদি আপনি এটা মানে" বলে, কিন্তু আসলে দ্বারা বোঝানো হয় inlineপরিষ্কার করা হয় না যেমন একটি নির্দেশ তার মূল অর্থ থেকে বিবর্তিত যে হিসাবে "ODR লঙ্ঘনের নিয়ে মন্তব্য করছি কম্পাইলার স্টপ" পাপী বলেছেন।

উত্তর:


96

এটি অপ্রাসঙ্গিক নয়। এবং না, প্রতিটি ফাংশন টেম্পলেট inlineডিফল্টরূপে হয় না। স্পষ্টীকৃত বিশেষায়িতকরণ ([temp.expl.spec]) এ স্ট্যান্ডার্ডটি এ সম্পর্কে আরও স্পষ্ট is

নিম্নলিখিত আছে:

a.cc

#include "tpl.h"

b.cc

#include "tpl.h"

tpl.h (স্পষ্ট স্পেশালাইজেশন থেকে নেওয়া):

#ifndef TPL_H
#define TPL_H
template<class T> void f(T) {}
template<class T> inline T g(T) {}

template<> inline void f<>(int) {} // OK: inline
template<> int g<>(int) {} // error: not inline
#endif

এটি কম্পাইল করুন, এবং ভয়েলা:

g++ a.cc b.cc
/tmp/ccfWLeDX.o: In function `int g<int>(int)':
inlinexx2.cc:(.text+0x0): multiple definition of `int g<int>(int)'
/tmp/ccUa4K20.o:inlinexx.cc:(.text+0x0): first defined here
collect2: ld returned 1 exit status

inlineসুস্পষ্ট তাত্ক্ষণিক কাজ করার সময় উল্লেখ না করাও সমস্যার কারণ হতে পারে।

সুতরাং সংক্ষিপ্তসারে : সম্পূর্ণরূপে বিশেষায়িত ফাংশন টেম্পলেটগুলির জন্য, যেমন কমপক্ষে একটি অজানা প্রকার বহন করে, আপনি বাদ দিতে পারেন inlineএবং ত্রুটিগুলি গ্রহণ করতে পারবেন না, তবে তারা তা নয় inline। সম্পূর্ণ বিশেষায়নের জন্য, যেমন কেবল পরিচিত প্রকারগুলি ব্যবহার করে, আপনি এটিকে বাদ দিতে পারবেন না।

থাম্বের প্রস্তাবিত নিয়ম : আপনি inlineযদি এটি বোঝাতে চান তবে লিখুন এবং কেবল সামঞ্জস্য বজায় রাখুন। এটি আপনাকে কেবল কারণেই করতে পারে বা না করা সম্পর্কে কম চিন্তাভাবনা করে। (থাম্বের এই নিয়মটি ভ্যান্ডেভার্ডের / জোসুটিসের সি ++ টেমপ্লেট: সম্পূর্ণ গাইড ) অনুসারে চলছে


2
একটি লিখতে পারে, সত্য। তবে এটি স্বতন্ত্রতা বোঝায় না, এমনকি যদি এটি প্রদর্শিত হয়। ভ্যান্ডেভাওর্ডে এবং জোসুটিস সি ++ টেমপ্লেটগুলিতেও
সেবাস্তিয়ান মাচ

43
স্পষ্ট স্পেশালাইজেশন কোনও টেম্পলেট নয়।
কুকুরছানা

2
@ ডিএডএমজি: তবুও সাধারণ কাজের উপরে নজর রাখার সময় সম্পূর্ণ বিশেষজ্ঞের চেয়ে বেশি পছন্দ করা হয়, সুতরাং সেগুলি যদি টেমপ্লেট বা নন-টেম্পলেট না হয় তবে সেগুলি কী?
সেবাস্তিয়ান মাচ

13
এই উত্তরটি ভুল। টেমপ্লেটের স্পষ্ট বিশেষায়িতকরণ কোনও ফাংশন, কোনও টেম্পলেট নয়। এই ফাংশনটি inlineবিশেষভাবে তৈরি হওয়া টেম্পলেটটি চিহ্নিত হওয়ার কারণে হয়ে ওঠে না inline। সুতরাং inlineটেমপ্লেট সম্পূর্ণ অপ্রাসঙ্গিক। এই ফাংশনটি হওয়া উচিত কিনা inlineতা কোনও টেমপ্লেট বিশেষায়নের মাধ্যমে তৈরি হওয়া থেকে কিছুই করার নেই (এবং ব্যবহারের সময় এই ঠিকানাটির চেয়ে আরও ভাল উত্তর রয়েছে inline)। নীচে @ পপির উত্তর সঠিক, এটি এক নয়। যোগ করার পদ্ধতি inlineএকটি টেমপ্লেট অপ্রাসঙ্গিক, এবং clang-tidyআসলে এটি সরিয়ে দেব।
gnzlbg

6
এছাড়াও, উদাহরণটি কেবল সাধারণ ফাংশনগুলির জন্য ওডিআর সম্পর্কিত সমস্যাগুলি প্রদর্শন করে (আচরণের সাথে টেমপ্লেটগুলির সাথে কোনও সম্পর্ক নেই)। দেখাচ্ছে যে প্রচেষ্টা করতে inlineঅপ্রাসঙ্গিক হবে না হয়, উদাহরণস্বরূপ স্পষ্টভাবে বিশেষজ্ঞ ক্ষেত্রে আবরণ উচিত template<> void f<>(int) {} ছাড়াinline শব্দ। তবে তারপরেও inlineটেমপ্লেটে স্পেসিফায়ার পরিবর্তন করা কোনও inlineতাত্পর্যপূর্ণ করে না, কারণ আপনি টেমপ্লেটটি চিহ্নিত করেন বা না তা অপ্রাসঙ্গিক।
gnzlbg

34

এটি অপ্রাসঙ্গিক। সমস্ত টেম্পলেট ইতিমধ্যে রয়েছে inline- 2012 সালের হিসাবে, inlineকীওয়ার্ডটির একমাত্র ব্যবহার হ'ল ওডিআর লঙ্ঘন সম্পর্কে অভিযোগকারীদের থামানো। আপনি একেবারে সঠিক - আপনার বর্তমান-প্রজন্মের সংকলকটি নিজেরাই কী ইনলাইন করতে হবে তা জানতে পারে এবং সম্ভবত অনুবাদ ইউনিটগুলির মধ্যেও এটি করতে পারে।


11
স্ট্যান্ডার্ডটি সমস্ত টেম্পলেটগুলি ইনলাইন রয়েছে তা উল্লেখ করে না।
সেবাস্তিয়ান মাচ

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

2
@ বেনভয়েগ: আমি ওডিআর এর অর্থ সম্পর্কে জানি inline। নীচে আমার উত্তরটি দেখুন (বা উপরে, বাছাই করা বাছাইয়ের উপর নির্ভর করে) have অ-বিশেষায়িত টেম্পলেটগুলির জন্য, আপনি অবশ্যই সঠিক, তবে এটি আনুষ্ঠানিকভাবে এক নয়।
সেবাস্তিয়ান মাচ

3
@ ডিড এমএমজি: সি ++ তে কোনও প্রয়োজন নেই যে একটি ফাংশন টেম্পলেটটি অবশ্যই একটি শিরোনাম ফাইলটিতে প্রয়োগ করতে হবে; এটি যে কোনও জায়গায় প্রয়োগ করা যেতে পারে। এটি প্রতিফলিত করতে, আমি inlineযা ইনলাইন বলে মনে হয় তা ট্যাগ করার প্রস্তাব দিই । এটি সাধারণত কোনও পার্থক্য করে না, তবে স্ট্যান্ডার্ডিজগুলিতে সেগুলি এক নয় এবং এগুলি সমস্ত ইনলাইন নয়। আমি এটি "এটি অপ্রাসঙ্গিক" বলে আপনার অবস্থানটি স্বীকার করি, তবে মান অনুসারে সমস্ত টেমপ্লেটগুলি ইনলাইন নয়, কেবলমাত্র আপনার জন্য সি ++ - ব্যবহারকারী হিসাবে তারা উপস্থিত হয়।
সেবাস্তিয়ান মাচ

7
স্বীকৃত উত্তরের উপর আপনার মন্তব্য যে স্পষ্টত বিশেষায়িতকরণ কোনও টেম্পলেট নয় (যা অবশ্যই বলা হওয়ার পরে স্পষ্টতই ....) সম্ভবত এই পৃষ্ঠার সবচেয়ে সহায়ক বিষয়। আপনি কি আপনার উত্তরে এটি যুক্ত করতে আপত্তি করবেন?
কাইল স্ট্র্যান্ড

6

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

ব্যবহার inlineএকটি (দরিদ্র) ইস্যু বৃত্তাকার পেয়ে প্রতিটি সংকলন ইউনিট একই টেমপ্লেট করা বর্গ জন্য পৃথক বস্তু তৈরি করবে প্রণালী ব্যবহার করা হয় টেমপ্লেট সঙ্গে যা would লিংক সময়ে অনুলিপি বিষয় কারণ তারপর। inline(আমি মনে করি) ব্যবহার করে নাম ম্যাংলিং বিভিন্নভাবে কাজ করে যা লিঙ্ক সময়ে নাম সংঘর্ষের সাথে গোলাকার হয়ে যায় তবে প্রচুর ব্লাড কোড ব্যয় করে।  

মার্শাল ক্লাইন এটির চেয়ে এখানে আরও ভাল ব্যাখ্যা করে


@ শিও: এমনটি আগে হত না। এখানে চেক করুন: gcc.gnu.org/onlinesocs/gcc-4.0.4/gcc/… আমি ধরে নিলাম যে সাম্প্রতিককালে পরিবর্তিত হয়েছে, সে কারণেই আমি অতীত কাল নিয়ে কথা বলছিলাম।
উপাদান 10

2
@ শিও: আপনি কি আমাকে স্ট্যান্ডার্ডের অংশটিতে ইঙ্গিত করতে পারেন যা জানায় যে ফাংশন টেম্পলেটগুলি সর্বদা ইনলাইন থাকে? কারণ, তারা না।
সেবাস্তিয়ান মাচ

@ ফ্রেসনেল: আকর্ষণীয়, আমি শপথ করতে পারলাম আমি এটি স্ট্যান্ডার্ডে পড়েছি। ফাংশন টেম্পলেটগুলি ওডিআর ( §14.5.5.1 p7 & p8) থেকে অব্যাহতিপ্রাপ্ত হতে পারে এই বিষয়টিটির সাথে আমি মিশ্রিত করতে পারি । আমার খারাপ, আমি ভুল মন্তব্যটি সরিয়েছি।
Xoo

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