কেবল শিরোনামের পাঠাগারগুলি কি আরও দক্ষ?


48

অনুমিতি

  1. কেবলমাত্র সি ++ এর জন্য শিরোনাম-কেবল লাইব্রেরিগুলির একটি সুবিধা হ'ল এগুলি পৃথকভাবে সংকলন করার দরকার নেই।

  2. সি এবং সিতে ++ inlineকেবল তখনই বোধগম্য হয় যদি ফাংশনটি একটি শিরোনাম ফাইল * এ সংজ্ঞায়িত করা হয়।

  3. Ditionতিহ্যগতভাবে, সি, .c / .h লেআউট ব্যবহার করা হয়েছে, যেখানে শিরোনাম অনুবাদ ইউনিটের সর্বনিম্ন পাবলিক ইন্টারফেসের প্রতিনিধিত্ব করে। একইভাবে .cpp / hpp।

প্রশ্ন

কেবল শিরোনামের লাইব্রেরিগুলি কি সাধারণত efficientতিহ্যবাহী বিন্যাসের চেয়ে কার্যকর কোড- এবং প্রয়োগের সময় বুদ্ধিমান? যদি তা হয় তবে এটি কি ব্যাপক ইনলাইনিং বা অন্যান্য অপ্টিমাইজেশনের কারণে?

* - ফাংশনটিকে শিরোনামে সংজ্ঞায়িতকরণ সংকলকটিকে কোনও অনুবাদ ইউনিট সংকলনের সময় বাস্তবায়ন দেখতে দেয় এবং কার্যত ইনলাইনিং কোডটি সম্ভব করে তোলে


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

1
আমি জানি না যে এটি একটি পূর্ণ উত্তরের প্রাপ্য, তবে কেবলমাত্র শিরোনামের একটি বড় সুবিধা হ'ল ইনস্টলেশন ও ব্যবহারের সহজতা: ডাউনলোড, # অন্তর্ভুক্ত "lib.h (পিপি)", সম্পন্ন।
ওয়েলেলিক

উত্তর:


44

কেবলমাত্র সি ++ এর জন্য শিরোনাম-কেবল লাইব্রেরিগুলির একটি সুবিধা হ'ল এগুলি পৃথকভাবে সংকলন করার দরকার নেই

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

সি এবং সি ইন + ইনলাইন কেবল তখনই বোধগম্য হয় যদি ফাংশনটি একটি শিরোনাম ফাইলে সংজ্ঞায়িত করা হয় *

এটি সংকলক / লিঙ্কার সিস্টেমের উপর নির্ভর করে তবে বেশিরভাগ বিদ্যমান সি এবং সি ++ সংকলকগুলির জন্য আমার ধারণা এটি সত্য।

Ditionতিহ্যগতভাবে, সি, .c / .h লেআউট ব্যবহার করা হয়েছে, যেখানে শিরোনাম অনুবাদ ইউনিটের সর্বনিম্ন পাবলিক ইন্টারফেসের প্রতিনিধিত্ব করে। একইভাবে .cpp / hpp।

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

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

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

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


6
সুতরাং সংক্ষেপে, কেবল শিরোনামের পাঠাগারগুলি আরও দক্ষতার চেয়ে আরও সুবিধাজনক ; এবং যেহেতু সি ++ এর কোনও মানক প্যাকেজ পরিচালক নেই তাই এটি ড্রাইভিং গ্রহণে সহায়তা করে।
ম্যাথিউ এম।

6
@ ম্যাথিউইউএম: না, সংকলিত কোডটি সত্যই মাঝে মধ্যে আরও কার্যকর হতে পারে এবং টেমপ্লেট লিবের জন্য কেবল শিরোনামের নকশাই সাধারণত সুবিধার প্রশ্নই আসে না। এবং সংকলিত বার বাড়ানো অবশ্যই বেশি সুবিধাজনক নয়।
ডক ব্রাউন

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

1
@ ম্যাথিউইউম: এটি অবশ্যই সঠিক, তবে আমি মনে করি "আরও বেশি সুবিধাজনক" শব্দটি কেসটি ভালভাবে বর্ণনা করে না।
ডক ব্রাউন

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

15

ঠিক আছে, আসুন প্রথমে আপনার কিছু অনুমানকে ভেঙে ফেলা যাক:

  1. কেবলমাত্র সি ++ এর জন্য শিরোনাম-কেবল লাইব্রেরিগুলির একটি সুবিধা হ'ল এগুলি পৃথকভাবে সংকলন করার দরকার নেই।

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

  1. সি এবং সি ইন + ইনলাইন কেবল তখনই বোধগম্য হয় যদি ফাংশনটি একটি শিরোনাম ফাইল * এ সংজ্ঞায়িত করা হয়।

হ্যাঁ, একমাত্র প্রভাবটি inlineকেবলমাত্র এক-সংজ্ঞা-নিয়মের ব্যতিক্রম ।
ধিক্ আপনারা যদি এই সংজ্ঞাগুলি কোনওভাবেই আলাদা হয়।

সুতরাং, যদি কোনও ক্রিয়া সংকলন-ইউনিটের অভ্যন্তরীণ হয় তবে এটি চিহ্নিত করুন static। এটি ইনলাইনিংকে আরও বেশি সম্ভাবনা দেয় কারণ কার্যকারিতাটি ইনলাইন করার জন্য উপলব্ধ হওয়া দরকার।
তবুও, লিঙ্ক-টাইম-অপ্টিমাইজেশানটি একবার দেখুন, কমপক্ষে এমএসভিসি ++, জিসিসি এবং ঝনঝন দ্বারা সমর্থিত।

  1. Ditionতিহ্যগতভাবে, সি, .c / .h লেআউট ব্যবহার করা হয়েছে, যেখানে শিরোনাম অনুবাদ ইউনিটের সর্বনিম্ন পাবলিক ইন্টারফেসের প্রতিনিধিত্ব করে। একইভাবে .cpp / hpp।

ভাল, কেবলমাত্র সর্বনিম্ন ইন্টারফেস উপস্থাপন করা উচ্চতর এপিআই এবং এবিআইয়ের স্থিতিশীলতা অর্জন এবং সংকলনের সময়কে হ্রাস করার লক্ষ্যে অন্যতম লক্ষ্য।

বিশেষত সি ++ ক্লাসগুলি যদিও এটির দিকে ততটা আগ্রহী নয়, সমস্ত ব্যক্তিগত বিটগুলি শিরোনামের মধ্যে যেমন ফাঁস হয়ে যায়, সুরক্ষিতগুলি যেমন আপনি এটি থেকে পেতে চান কিনা তা করুন do

ডিজাইন-প্যাটার্ন পিআইএমপিএল এই জাতীয় বিবরণ হ্রাস করার জন্য।

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

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

কেবল শিরোনামের লাইব্রেরিগুলি কি সাধারণত efficientতিহ্যবাহী বিন্যাসের চেয়ে কার্যকর কোড- এবং প্রয়োগের সময় বুদ্ধিমান? যদি তা হয় তবে এটি কি ব্যাপক ইনলাইনিং বা অন্যান্য অপ্টিমাইজেশনের কারণে?

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

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

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