কেবল শিরোনামের পাঠাগারগুলির সুবিধা


101

কেবল একটি শিরোলেখের পাঠাগারের সুবিধা কী কী এবং আপনি কেন সেভাবে এটি লিখবেন যে প্রয়োগটি পৃথক ফাইলে রাখার বিরোধিতা করছেন?


বেশিরভাগ টেম্পলেটগুলি, তবে এটি বিতরণ এবং ব্যবহার করা কিছুটা সহজ করে দেবে।
BoBTFish

4
আমি প্রশ্নের
স্কোয়ারে

ইতিমধ্যে উল্লেখ করা হয়নি এমন কোন উত্সাহ রয়েছে?
নেবুলাফক্স

7
@moooeeeep: মূল্যবান স্বরূপ, আপনি অনুচ্ছেদ পড়তে চান পারে "স্টপ ইনলাইনিং কোড"সি ++ করণীয় এবং কী করা উচিত না ক্রোমিয়াম প্রকল্প ওয়েব পৃষ্ঠা।
মিঃসি 64

উত্তর:


57

এমন পরিস্থিতি রয়েছে যখন শিরোনাম-কেবল গ্রন্থাগারই একমাত্র বিকল্প, উদাহরণস্বরূপ টেমপ্লেটগুলি নিয়ে কাজ করার সময়।

কেবলমাত্র শিরোনামের পাঠাগারটির অর্থ হ'ল লাইব্রেরিটি ব্যবহৃত হতে পারে এমন বিভিন্ন প্ল্যাটফর্ম সম্পর্কে আপনাকে চিন্তা করতে হবে না। আপনি যখন প্রয়োগটি পৃথক করেন, আপনি সাধারণত প্রয়োগের বিবরণগুলি গোপন করার জন্য এটি করেন এবং শিরোনাম এবং গ্রন্থাগারগুলির সংমিশ্রণ হিসাবে লাইব্রেরি বিতরণ করেন ( lib, dllএর .soফাইল বা ফাইল)। আপনার অবশ্যই অফার করে এমন সমস্ত অপারেটিং সিস্টেম / সংস্করণগুলির জন্য অবশ্যই এইগুলি সংকলন করতে হবে।

আপনি বাস্তবায়ন ফাইলগুলি বিতরণও করতে পারেন, তবে এর অর্থ ব্যবহারকারীর জন্য একটি অতিরিক্ত পদক্ষেপ - এটি ব্যবহারের আগে আপনার লাইব্রেরিটি সংকলন করতে হবে।

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


6
"কেবলমাত্র শিরোনামের লাইব্রেরি থাকার অর্থ হ'ল লাইব্রেরিটি ব্যবহার করা যেতে পারে যেখানে বিভিন্ন প্ল্যাটফর্ম সম্পর্কে আপনার চিন্তা করার দরকার নেই": কেবলমাত্র আপনার যদি গ্রন্থাগার রক্ষণাবেক্ষণ না করতে হয়। অন্যথায়, এটি একটি দুঃস্বপ্ন, বাগের প্রতিবেদন সহ যে আপনি নিজের সামগ্রীটি পুনরুত্পাদন করতে বা পরীক্ষা করতে পারবেন না।
জেমস কানজে

4
আমি কেবলমাত্র শিরোনামের পারফরম্যান্স সুবিধাগুলি সম্পর্কে অনুরূপ প্রশ্ন জিজ্ঞাসা করেছি। আপনি দেখতে পাচ্ছেন যে কোড আকারে কোনও পার্থক্য নেই। তবে, উদাহরণস্বরূপ শিরোনামের বাস্তবায়নটি 7% ধীর হয়ে গেছে। stackoverflow.com/questions/12290639/...
Homer6

@ হোমার 6 আমাকে পিং করার জন্য ধন্যবাদ আমি আসলে এটি কখনও পরিমাপ করিনি।
লুচিয়ান গ্রিগোর

4
পছন্দ করেছেন সে কারণেই উত্তর দিতে কিছুটা সময় নিয়েছিল। এখানে অনেকগুলি অনুমানমূলক "কোডের আকার বাড়ায়" এবং "মেমরির খরচ" মন্তব্য রয়েছে comments অবশেষে আমার কাছে পার্থক্যগুলির একটি স্ন্যাপশট রয়েছে, এমনকি এটি কেবলমাত্র একটি উদাহরণ।
হোমার 6

@ হোমার 6 কেন এটি কোডের আকার বাড়াবে না? ধরে নিচ্ছি যে আপনি একাধিক লিব তৈরি করেছেন যা কেবলমাত্র শিরোনাম ব্যবহার করে এবং তারপরে আপনার অ্যাপ্লিকেশন সমস্ত লিব ব্যবহার করে আপনার একক ভাগকৃত লাইব্রেরির সাথে লিঙ্ক করার বিপরীতে আপনার একাধিক কপি থাকতে হবে।
পুয়া 13

61

কেবলমাত্র শিরোলেখের পাঠাগারের সুবিধা:

  • বিল্ড প্রক্রিয়া সরল করে। আপনার লাইব্রেরিটি তৈরি করার দরকার নেই এবং বিল্ডের লিঙ্ক স্টেপের সময় আপনার সংকলিত লাইব্রেরি নির্দিষ্ট করার দরকার নেই। আপনার যদি একটি সংকলিত গ্রন্থাগার থাকে তবে আপনি সম্ভবত এটির একাধিক সংস্করণ তৈরি করতে চাইবেন: একটি ডিবাগিং সক্ষম সহ সংকলিত, অপ্টিমাইজেশান সক্ষম অন্যটি, এবং সম্ভবত আরও একটি চিহ্ন ছিটিয়ে। এবং একটি মাল্টি প্ল্যাটফর্ম সিস্টেমের জন্য আরও বেশি হতে পারে।

কেবল শিরোনামের লাইব্রেরির অসুবিধা:

  • বড় অবজেক্ট ফাইল। কিছু উত্স ফাইলে ব্যবহৃত লাইব্রেরির প্রতিটি ইনলাইন পদ্ধতিও সেই উত্স ফাইলের জন্য সংকলিত অবজেক্ট ফাইলে একটি দুর্বল প্রতীক, আউট-লাইন সংজ্ঞা পাবেন। এটি সংকলককে ধীর করে দেয় এবং লিঙ্কারটিকে ধীর করে দেয়। সংকলকটি সেই সমস্ত ব্লাট উত্পন্ন করতে হবে এবং তারপরে লিঙ্কারে এটি ফিল্টার করতে হবে।

  • দীর্ঘ সংকলন উপরে উল্লিখিত ব্লোট সমস্যাটি ছাড়াও, সংকলনটি আরও বেশি সময় লাগবে কারণ শিরোনামগুলি সংকলিত লাইব্রেরির চেয়ে শিরোনামের একমাত্র লাইব্রেরির সাথে সহজাতভাবে বৃহত্তর ly এই বড় শিরোনামগুলিকে লাইব্রেরি ব্যবহার করে এমন প্রতিটি উত্স ফাইলের জন্য পার্স করা দরকার। আর একটি বিষয় হ'ল কেবলমাত্র একটি শিরোলেখ লাইব্রেরিতে এই শিরোলেখ ফাইলগুলিকে #includeইনলাইন সংজ্ঞাগুলির পাশাপাশি শিরোনামগুলির প্রয়োজন হয় যদি গ্রন্থাগারটি একটি সংকলিত গ্রন্থাগার হিসাবে তৈরি করা হত।

  • আরও জটলা সংকলন। কেবল শিরোনামের লাইব্রেরির জন্য অতিরিক্ত অতিরিক্ত #includeপ্রয়োজনীয়গুলির কারণে আপনি শিরোনাম-কেবল লাইব্রেরির সাথে অনেক বেশি নির্ভরতা পান । লাইব্রেরিতে কিছু মূল ফাংশনের বাস্তবায়ন পরিবর্তন করুন এবং আপনার পুরো প্রকল্পটি পুনরায় সংকলনের প্রয়োজন হতে পারে। সংকলিত গ্রন্থাগারের জন্য উত্স ফাইলে সেই পরিবর্তনটি করুন এবং আপনাকে যা করতে হবে তা হল একটি লাইব্রেরি উত্স ফাইলটি পুনরায় কম্পাইল করা, সেই নতুন .o ফাইলের সাথে সংকলিত লাইব্রেরি আপডেট করুন এবং অ্যাপ্লিকেশনটিকে রিলিং করুন।

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


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

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

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

4
@ টমাস: একমত, শেষ পয়েন্টটি সম্পূর্ণ জাল। আপনি কেবলমাত্র শিরোনামের লাইব্রেরির সাথে ইন্টারফেস এবং বাস্তবায়নটিকে ঠিক ঠিক আলাদা রাখতে পারেন; আপনার কাছে কেবল ইন্টারফেস শিরোনাম রয়েছে # বাস্তবায়ন বিশদ অন্তর্ভুক্ত। এ কারণেই বুস্ট লাইব্রেরিতে সাধারণত একটি উপ-ডিরেক্টরি (এবং নেমস্পেস) অন্তর্ভুক্ত থাকে detail
নিমো

4
@ থমাস: আমি একমত নই শিরোনাম ফাইলটি সাধারণত নথির জন্য আমি প্রথমে যায়। শিরোনামটি যদি ভালভাবে লেখা থাকে তবে প্রায়শই বাহ্যিক ডকুমেন্টের প্রয়োজন হয় না।
জোয়েল করনেট

15

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

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

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

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

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

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

এই জিনিসগুলি অন্যান্য তৃতীয় পক্ষের লাইব্রেরির (যেমন একটি আইজেন ভেক্টর বা জিএসএল ম্যাট্রিক্স) লাইব্রেরির সীমানা পেরিয়ে অবজেক্ট / প্রকারগুলি পাস করার ক্ষেত্রেও সত্য। যদি 3 য় পক্ষের গ্রন্থাগারটি আপনার লাইব্রেরিটি সংকলন করে এবং আপনার ব্যবহারকারীর তাদের কোডটি সংকলন করে তাদের মধ্যে শিরোনাম পরিবর্তন করে তবে জিনিসগুলি বিভক্ত হবে।

মূলত সুরক্ষিত থাকার জন্য আপনি লাইব্রেরির সীমানা পেরিয়ে যেতে পারেন কেবল প্রকারের এবং পুরানো ডেটা (পিওডি)। আদর্শভাবে কোনও পিওডি এমন স্ট্রাক্টগুলিতে হওয়া উচিত যা আপনার নিজের শিরোনামে সংজ্ঞায়িত হয় এবং কোনও তৃতীয় পক্ষের শিরোনামের উপর নির্ভর করে না।

আপনি যদি কেবল একটি শিরোনামের লাইব্রেরি সরবরাহ করেন তবে সমস্ত কোড একই সংকলক সেটিংস এবং একই শিরোনামের বিপরীতে সংকলিত হয়ে যায় যাতে এই সমস্যাগুলি অনেকটাই চলে যায় (তৃতীয় আংশিক লাইব্রেরির সংস্করণ সরবরাহ করে আপনি এবং আপনার ব্যবহারকারীরা এপিআই সামঞ্জস্যপূর্ণ)।

তবে উপরে negativeণাত্মক উল্লেখ রয়েছে যা সংকলনের সময় বৃদ্ধি পেয়েছে। এছাড়াও আপনি হয়ত একটি ব্যবসা চালিয়ে যাচ্ছেন যাতে আপনার সমস্ত উত্স কোড প্রয়োগের বিশদ আপনার সমস্ত ব্যবহারকারীর কাছে হস্তান্তর না করতে পারে যদি তাদের মধ্যে কেউ এটি চুরি করে।


8

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


0

ইনলাইনিং লিঙ্ক টাইম অপ্টিমাইজেশন (এলটিও) দ্বারা করা যেতে পারে

আমি এটি হাইলাইট করতে চাই যেহেতু এটি কেবলমাত্র গ্রন্থাগারের শিরোনামের দুটি প্রধান সুবিধার একটির মান হ্রাস করে: "ইনলাইন করার জন্য আপনার একটি শিরোনামে সংজ্ঞা দরকার"।

এর একটি সর্বনিম্ন কংক্রিট উদাহরণ এখানে দেখানো হয়েছে: লিংক-সময় অপ্টিমাইজেশন এবং ইনলাইন

সুতরাং আপনি কেবল একটি পতাকা পাস করেছেন, এবং ইনফ্লাইনিং কোনও রিফ্যাক্টরিং কাজ ছাড়াই অবজেক্ট ফাইল জুড়ে করা যেতে পারে, এর জন্য আর শিরোনামে সংজ্ঞা রাখার দরকার নেই।

এলটিওর নিজস্ব ডাউনসাইডগুলিও থাকতে পারে: লিংক-টাইম অপ্টিমাইজেশন (এলটিও) ব্যবহার না করার কোনও কারণ আছে কি?

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