মডিউল ইন্টারফেসের ইনলাইন অর্থ


24

হেডার ফাইলটি বিবেচনা করুন:

class T
{
private:
  int const ID;

public:
  explicit T(int const ID_) noexcept : ID(ID_) {}

  int GetID() const noexcept { return ID; }
};

বা, বিকল্পভাবে:

class T
{
private:
  int const ID;

public:
  explicit T(int const ID_) noexcept;

  int GetID() const noexcept;
};

inline T::T(int const ID_) noexcept : ID(ID_) {}

inline int T::GetID() const noexcept { return ID; }

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

সি ++ 20 সমাপ্ত হয়েছিল এমন সভায় সাম্প্রতিক একটি প্রতিবেদনে আমি নীচের বিবৃতিটি পড়তে পারি:

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

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

যদি তা হয় তবে নীচের মডিউল ইন্টারফেসটি কি উপরের শিরোনামগুলির সমতুল্য হবে?

export module M;

export
class T
{
private:
  int const ID;

public:
  inline explicit T(int const ID_) noexcept : ID(ID_) {}

  inline int GetID() const noexcept { return ID; }
};

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

উত্তর:


11

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

কিছু মাত্রায়.

ইনলাইনিং হ'ল একটি "যেমন" অপটিমাইজেশন এবং সংকলক যথেষ্ট চৌকস হলে অনুবাদ ইউনিটগুলির মধ্যেও ইনলাইনিং ঘটতে পারে।

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

প্রাক-মডিউল বিশ্বে শ্রেণীর মধ্যে সংজ্ঞায়িত শ্রেণীর সদস্য সংজ্ঞাগুলি স্পষ্টভাবে ঘোষণা করা হয় inline। কেন? কারণ সংজ্ঞাটি ক্লাসের মধ্যে রয়েছে। প্রাক-মডিউল বিশ্বে টিউগুলির মধ্যে ভাগ করা শ্রেণীর সংজ্ঞাগুলি পাঠ্য অন্তর্ভুক্তি দ্বারা ভাগ করা হয়। ক্লাসে সংজ্ঞায়িত সদস্যদের তাই সেই টিউগুলির মধ্যে ভাগ করা শিরোনামে সংজ্ঞায়িত করা হবে। সুতরাং যদি একাধিক টিইউ একই ক্লাস ব্যবহার করে তবে সেই একাধিক টিইউ ক্লাস সংজ্ঞা এবং এর সদস্যদের সংজ্ঞাটি শিরোনামে অন্তর্ভুক্ত করে এটি করছে।

এটি হ'ল আপনি যেভাবেই সংজ্ঞাটি অন্তর্ভুক্ত করছেন , তবে কেন এটি তৈরি করবেন না inline?

অবশ্যই, এর অর্থ একটি ফাংশনের সংজ্ঞা এখন শ্রেণীর পাঠ্যের একটি অংশ of যদি আপনি কোনও শিরোনামে ঘোষিত সদস্যের সংজ্ঞাটি পরিবর্তন করেন তবে এটি পুনরুক্তার সাথে সেই শিরোলেখ অন্তর্ভুক্ত প্রতিটি ফাইলের পুনর্নির্মাণকে বাধ্য করে forces এমনকি যদি ক্লাসের ইন্টারফেসটি নিজেই পরিবর্তিত না হয়, তবুও আপনাকে পুনর্নির্মাণ করা দরকার। সুতরাং এই জাতীয় ফাংশন স্পষ্টভাবে তৈরি করা inlineএটি পরিবর্তন করে না, তাই আপনি এটিও করতে পারেন।

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

তবে এখানে জিনিসটি: একাধিক জায়গায় ক্লাস সরবরাহ করার উপায় হিসাবে পাঠ্য অন্তর্ভুক্তিটি ব্যবহার করার এটি একটি নিদর্শন।

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

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

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


8

এটি P1779 থেকে এসেছে , কিছুদিন আগে প্রাগে গৃহীত হয়েছিল। প্রস্তাবনা থেকে:

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

কাগজ (অন্যান্য জিনিসগুলির মধ্যে) বাক্যটি সরিয়ে দিয়েছে:

শ্রেণীর সংজ্ঞার মধ্যে সংজ্ঞায়িত একটি ফাংশন হ'ল একটি ইনলাইন ফাংশন।

এবং বাক্যটি যুক্ত করেছেন:

গ্লোবাল মডিউলটিতে, কোনও শ্রেণীর সংজ্ঞার মধ্যে সংজ্ঞায়িত কোনও ফাংশন অন্তর্নিহিতভাবে ইনলাইন হয় ([class.mfct], [class.friend])।


আপনার উদাহরণটি export module Mপ্রাথমিক প্রোগ্রামের মডুলার সমতুল্য হবে। নোট করুন যে সংকলকগণ ইতিমধ্যে টীকাগুলি নয় এমন ইনলাইন ফাংশন করে inline, কেবলমাত্র তারা inlineহিউরিস্টিকসে কীওয়ার্ডের উপস্থিতি ব্যবহার করে ।


সুতরাং, inlineকীওয়ার্ড ব্যতীত কোনও মডিউলে কোনও ফাংশন সংকলক দ্বারা কখনই ইনলাইন করা যাবে না, সঠিক?
ধাতবফক্স

1
@ মেটালফক্স না, আমি বিশ্বাস করি না যে এটি সঠিক।
ব্যারি

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