কেবল একটি শিরোলেখের পাঠাগারের সুবিধা কী কী এবং আপনি কেন সেভাবে এটি লিখবেন যে প্রয়োগটি পৃথক ফাইলে রাখার বিরোধিতা করছেন?
কেবল একটি শিরোলেখের পাঠাগারের সুবিধা কী কী এবং আপনি কেন সেভাবে এটি লিখবেন যে প্রয়োগটি পৃথক ফাইলে রাখার বিরোধিতা করছেন?
উত্তর:
এমন পরিস্থিতি রয়েছে যখন শিরোনাম-কেবল গ্রন্থাগারই একমাত্র বিকল্প, উদাহরণস্বরূপ টেমপ্লেটগুলি নিয়ে কাজ করার সময়।
কেবলমাত্র শিরোনামের পাঠাগারটির অর্থ হ'ল লাইব্রেরিটি ব্যবহৃত হতে পারে এমন বিভিন্ন প্ল্যাটফর্ম সম্পর্কে আপনাকে চিন্তা করতে হবে না। আপনি যখন প্রয়োগটি পৃথক করেন, আপনি সাধারণত প্রয়োগের বিবরণগুলি গোপন করার জন্য এটি করেন এবং শিরোনাম এবং গ্রন্থাগারগুলির সংমিশ্রণ হিসাবে লাইব্রেরি বিতরণ করেন ( lib
, dll
এর .so
ফাইল বা ফাইল)। আপনার অবশ্যই অফার করে এমন সমস্ত অপারেটিং সিস্টেম / সংস্করণগুলির জন্য অবশ্যই এইগুলি সংকলন করতে হবে।
আপনি বাস্তবায়ন ফাইলগুলি বিতরণও করতে পারেন, তবে এর অর্থ ব্যবহারকারীর জন্য একটি অতিরিক্ত পদক্ষেপ - এটি ব্যবহারের আগে আপনার লাইব্রেরিটি সংকলন করতে হবে।
অবশ্যই এটি কেস বাই কেস ভিত্তিতে প্রযোজ্য । উদাহরণস্বরূপ, কেবলমাত্র শিরোলেখের লাইব্রেরিগুলি কখনও কখনও বৃদ্ধি পায়কোড আকার এবং সংকলনের সময়
কেবলমাত্র শিরোলেখের পাঠাগারের সুবিধা:
কেবল শিরোনামের লাইব্রেরির অসুবিধা:
বড় অবজেক্ট ফাইল। কিছু উত্স ফাইলে ব্যবহৃত লাইব্রেরির প্রতিটি ইনলাইন পদ্ধতিও সেই উত্স ফাইলের জন্য সংকলিত অবজেক্ট ফাইলে একটি দুর্বল প্রতীক, আউট-লাইন সংজ্ঞা পাবেন। এটি সংকলককে ধীর করে দেয় এবং লিঙ্কারটিকে ধীর করে দেয়। সংকলকটি সেই সমস্ত ব্লাট উত্পন্ন করতে হবে এবং তারপরে লিঙ্কারে এটি ফিল্টার করতে হবে।
দীর্ঘ সংকলন উপরে উল্লিখিত ব্লোট সমস্যাটি ছাড়াও, সংকলনটি আরও বেশি সময় লাগবে কারণ শিরোনামগুলি সংকলিত লাইব্রেরির চেয়ে শিরোনামের একমাত্র লাইব্রেরির সাথে সহজাতভাবে বৃহত্তর ly এই বড় শিরোনামগুলিকে লাইব্রেরি ব্যবহার করে এমন প্রতিটি উত্স ফাইলের জন্য পার্স করা দরকার। আর একটি বিষয় হ'ল কেবলমাত্র একটি শিরোলেখ লাইব্রেরিতে এই শিরোলেখ ফাইলগুলিকে #include
ইনলাইন সংজ্ঞাগুলির পাশাপাশি শিরোনামগুলির প্রয়োজন হয় যদি গ্রন্থাগারটি একটি সংকলিত গ্রন্থাগার হিসাবে তৈরি করা হত।
আরও জটলা সংকলন। কেবল শিরোনামের লাইব্রেরির জন্য অতিরিক্ত অতিরিক্ত #include
প্রয়োজনীয়গুলির কারণে আপনি শিরোনাম-কেবল লাইব্রেরির সাথে অনেক বেশি নির্ভরতা পান । লাইব্রেরিতে কিছু মূল ফাংশনের বাস্তবায়ন পরিবর্তন করুন এবং আপনার পুরো প্রকল্পটি পুনরায় সংকলনের প্রয়োজন হতে পারে। সংকলিত গ্রন্থাগারের জন্য উত্স ফাইলে সেই পরিবর্তনটি করুন এবং আপনাকে যা করতে হবে তা হল একটি লাইব্রেরি উত্স ফাইলটি পুনরায় কম্পাইল করা, সেই নতুন .o ফাইলের সাথে সংকলিত লাইব্রেরি আপডেট করুন এবং অ্যাপ্লিকেশনটিকে রিলিং করুন।
মানুষের পক্ষে পড়া শক্ত। এমনকি সেরা ডকুমেন্টেশন সহ, একটি লাইব্রেরির ব্যবহারকারীদের প্রায়শই গ্রন্থাগারের জন্য শিরোনামগুলি পড়তে অবলম্বন করতে হয়। কেবল শিরোনামের লাইব্রেরিতে শিরোনামগুলি প্রয়োগকরণের বিশদ দিয়ে পূর্ণ থাকে যা ইন্টারফেসটি বোঝার পথে পায়। একটি সংকলিত লাইব্রেরি সহ, আপনি যা দেখেন তা হ'ল ইন্টারফেস এবং বাস্তবায়ন কী করে তা সম্পর্কে একটি সংক্ষিপ্ত ভাষ্য এবং এটি সাধারণত আপনি চান। সত্যিই আপনার এটি করা উচিত। লাইব্রেরিটি কীভাবে ব্যবহার করতে হয় তা জানতে আপনার প্রয়োগের বিশদ জানতে হবে না।
detail
।
আমি জানি এটি একটি পুরানো থ্রেড, তবে কেউ এবিআই ইন্টারফেস বা নির্দিষ্ট সংকলক সংক্রান্ত সমস্যার উল্লেখ করেনি। তাই আমি ভেবেছিলাম আমি করব।
এটি মূলত আপনার ধারণার উপর ভিত্তি করে হয় হয় হয় হেডারের সাথে একটি লাইব্রেরি লেখার জন্য লোককে বিতরণ করা বা নিজেকে পুনরায় ব্যবহার করে বনাম সমস্ত কিছু শিরোনামে থাকা। আপনি যদি কোনও শিরোনাম এবং উত্স ফাইল পুনরায় ব্যবহার এবং প্রতিটি প্রকল্পে এগুলি পুনরায় সংকলনের কথা ভাবছেন তবে এটি সত্যিই প্রয়োগ হয় না।
মূলত আপনি যদি নিজের সি ++ কোডটি সংকলন করেন এবং একটি সংকলক দিয়ে একটি লাইব্রেরি তৈরি করেন তবে ব্যবহারকারী সেই লাইব্রেরিটিকে একটি ভিন্ন সংকলক বা একই সংকলকটির একটি পৃথক সংস্করণ দিয়ে ব্যবহার করার চেষ্টা করে তবে বাইনারি অসম্পূর্ণতার কারণে আপনি লিঙ্কার ত্রুটি বা অদ্ভুত রানটাইম আচরণ পেতে পারেন।
উদাহরণস্বরূপ সংকলক বিক্রেতারা প্রায়শই সংস্করণগুলির মধ্যে এসটিএল তাদের প্রয়োগ পরিবর্তন করে। আপনার যদি একটি লাইব্রেরিতে কোনও ফাংশন রয়েছে যা একটি স্টাড :: ভেক্টর গ্রহণ করে তবে লাইব্রেরিটি সংকলিত হওয়ার সময় সেই শ্রেণীর বাইটগুলি যেভাবে সাজানো হয়েছিল সেগুলি প্রত্যাশা করে। যদি, একটি নতুন সংকলক সংস্করণে, বিক্রেতা স্টাডি :: ভেক্টরটিতে দক্ষতা উন্নতি করেছে তবে ব্যবহারকারীর কোডটি নতুন শ্রেণিটি দেখতে পাবে যার আলাদা কাঠামো থাকতে পারে এবং সেই নতুন কাঠামোটি আপনার লাইব্রেরিতে পাস করে। সেখান থেকে সবকিছু উতরাই হয়ে যায় ... এ কারণেই লাইব্রেরির সীমানা পেরিয়ে এসটিএল অবজেক্টগুলি পাস না করার পরামর্শ দেওয়া হয়। এটি সি রান-টাইম (সিআরটি) ধরণের ক্ষেত্রে প্রযোজ্য।
সিআরটি সম্পর্কে কথা বলার সময়, আপনার লাইব্রেরি এবং ব্যবহারকারীর উত্স কোডটি সাধারণত একই সিআরটি-র সাথে লিঙ্ক করা প্রয়োজন। ভিজুয়াল স্টুডিওর সাহায্যে যদি আপনি মাল্টিথ্রেডেড সিআরটি ব্যবহার করে আপনার গ্রন্থাগারটি তৈরি করেন তবে ব্যবহারকারীরা মাল্টিথ্রেডড ডিবাগ সিআরটি-র বিপরীতে লিঙ্ক করেন তবে আপনার লিঙ্কটি সমস্যা হবে কারণ আপনার গ্রন্থাগারটি এটির জন্য প্রয়োজনীয় চিহ্নগুলি নাও পেতে পারে। এটি কোন ফাংশনটি ছিল তা আমি মনে করতে পারি না তবে ভিজ্যুয়াল স্টুডিও 2015 এর জন্য মাইক্রোসফ্ট একটি সিআরটি ফাংশন ইনলাইন করেছিল। হঠাৎ এটি শিরোনামে ছিল না সিআরটি লাইব্রেরি তাই লাইব্রেরিগুলি প্রত্যাশা করেছিল যে এটি লিঙ্ক সময়ে খুঁজে পেতে পারে না এবং এই উত্পন্ন লিঙ্ক ত্রুটিগুলি। ফলাফলটি ছিল যে এই লাইব্রেরিগুলির ভিজ্যুয়াল স্টুডিও 2015 এর সাথে পুনরায় সংশোধন করা দরকার।
আপনি যদি উইন্ডোজ এপিআই ব্যবহার করেন তবে আপনি লাইব্রেরি ব্যবহারকারীর কাছে বিভিন্ন ইউনিকোড সেটিংসের সাহায্যে লিংক ত্রুটি বা অদ্ভুত আচরণ পেতে পারেন। এর কারণ উইন্ডোজ এপিআই-এর ফাংশন রয়েছে যা ইউনিকোড বা এএসসিআইআই স্ট্রিং ব্যবহার করে এবং ম্যাক্রোস / সংজ্ঞা দেয় যা স্বয়ংক্রিয়ভাবে প্রকল্পের ইউনিকোড সেটিংসের উপর ভিত্তি করে সঠিক প্রকারগুলি ব্যবহার করে। যদি আপনি লাইব্রেরির সীমানা জুড়ে একটি স্ট্রিং পাস করেন যা ভুল টাইপ হয় তবে জিনিসগুলি রানটাইমের সময় ভেঙে যায়। অথবা আপনি দেখতে পারেন যে প্রোগ্রামটি প্রথম স্থানে লিঙ্ক করে না।
এই জিনিসগুলি অন্যান্য তৃতীয় পক্ষের লাইব্রেরির (যেমন একটি আইজেন ভেক্টর বা জিএসএল ম্যাট্রিক্স) লাইব্রেরির সীমানা পেরিয়ে অবজেক্ট / প্রকারগুলি পাস করার ক্ষেত্রেও সত্য। যদি 3 য় পক্ষের গ্রন্থাগারটি আপনার লাইব্রেরিটি সংকলন করে এবং আপনার ব্যবহারকারীর তাদের কোডটি সংকলন করে তাদের মধ্যে শিরোনাম পরিবর্তন করে তবে জিনিসগুলি বিভক্ত হবে।
মূলত সুরক্ষিত থাকার জন্য আপনি লাইব্রেরির সীমানা পেরিয়ে যেতে পারেন কেবল প্রকারের এবং পুরানো ডেটা (পিওডি)। আদর্শভাবে কোনও পিওডি এমন স্ট্রাক্টগুলিতে হওয়া উচিত যা আপনার নিজের শিরোনামে সংজ্ঞায়িত হয় এবং কোনও তৃতীয় পক্ষের শিরোনামের উপর নির্ভর করে না।
আপনি যদি কেবল একটি শিরোনামের লাইব্রেরি সরবরাহ করেন তবে সমস্ত কোড একই সংকলক সেটিংস এবং একই শিরোনামের বিপরীতে সংকলিত হয়ে যায় যাতে এই সমস্যাগুলি অনেকটাই চলে যায় (তৃতীয় আংশিক লাইব্রেরির সংস্করণ সরবরাহ করে আপনি এবং আপনার ব্যবহারকারীরা এপিআই সামঞ্জস্যপূর্ণ)।
তবে উপরে negativeণাত্মক উল্লেখ রয়েছে যা সংকলনের সময় বৃদ্ধি পেয়েছে। এছাড়াও আপনি হয়ত একটি ব্যবসা চালিয়ে যাচ্ছেন যাতে আপনার সমস্ত উত্স কোড প্রয়োগের বিশদ আপনার সমস্ত ব্যবহারকারীর কাছে হস্তান্তর না করতে পারে যদি তাদের মধ্যে কেউ এটি চুরি করে।
প্রধান "সুবিধা" হ'ল এটি আপনার উত্স কোড সরবরাহ করার প্রয়োজন হয়, তাই আপনি মেশিনে ত্রুটি সংক্রান্ত প্রতিবেদনগুলি এবং আপনি কখনও শুনেননি এমন সংকলকগুলি সহ শেষ করবেন। লাইব্রেরিটি সম্পূর্ণরূপে টেম্পলেটগুলি থাকে, আপনার খুব বেশি পছন্দ হয় না তবে আপনি যখন পছন্দ করেন তখন শিরোনামটি সাধারণত একটি দুর্বল প্রকৌশল পছন্দ হয় is (অন্যদিকে, অবশ্যই, শিরোনামের অর্থ হ'ল আপনাকে কোনও সংহতকরণের প্রক্রিয়া ডকুমেন্ট করতে হবে না))
ইনলাইনিং লিঙ্ক টাইম অপ্টিমাইজেশন (এলটিও) দ্বারা করা যেতে পারে
আমি এটি হাইলাইট করতে চাই যেহেতু এটি কেবলমাত্র গ্রন্থাগারের শিরোনামের দুটি প্রধান সুবিধার একটির মান হ্রাস করে: "ইনলাইন করার জন্য আপনার একটি শিরোনামে সংজ্ঞা দরকার"।
এর একটি সর্বনিম্ন কংক্রিট উদাহরণ এখানে দেখানো হয়েছে: লিংক-সময় অপ্টিমাইজেশন এবং ইনলাইন
সুতরাং আপনি কেবল একটি পতাকা পাস করেছেন, এবং ইনফ্লাইনিং কোনও রিফ্যাক্টরিং কাজ ছাড়াই অবজেক্ট ফাইল জুড়ে করা যেতে পারে, এর জন্য আর শিরোনামে সংজ্ঞা রাখার দরকার নেই।
এলটিওর নিজস্ব ডাউনসাইডগুলিও থাকতে পারে: লিংক-টাইম অপ্টিমাইজেশন (এলটিও) ব্যবহার না করার কোনও কারণ আছে কি?