আমি আশা করি আপনি বুঝতে পেরেছেন যে এগুলি সব জাভা এবং সি ++ উভয়ের জন্যই গভীরভাবে বাস্তবায়ন-সংজ্ঞায়িত। বলা হচ্ছে, জাভার অবজেক্ট মডেলটিতে বেশ খানিকটা জায়গা প্রয়োজন।
সি ++ অবজেক্টের (সাধারণভাবে) সদস্যদের প্রয়োজন ব্যতীত কোনও স্টোরেজ প্রয়োজন হয় না। নোট করুন (জাভা থেকে পৃথক, যেখানে ব্যবহারকারী-সংজ্ঞায়িত সমস্ত কিছুই একটি রেফারেন্স টাইপ), ক্লায়েন্ট কোড কোনও বস্তুকে মান প্রকার বা রেফারেন্স ধরণের হিসাবে ব্যবহার করতে পারে, অর্থাত্ কোনও বস্তু অন্য বস্তুর জন্য পয়েন্টার / রেফারেন্স সংরক্ষণ করতে পারে, বা সরাসরি বস্তুকে সঞ্চয় করতে পারে ইন্ডিয়ারেশন ছাড়াই যদি কোনও virtual
পদ্ধতি থাকে তবে অবজেক্টের জন্য অতিরিক্ত অতিরিক্ত পয়েন্টার প্রয়োজন , তবে পলিমারফিজম ছাড়াই বেশ কয়েকটি দরকারী ক্লাস তৈরি করা হয়েছে এবং এটির প্রয়োজন নেই। কোনও জিসি মেটাডেটা নেই এবং প্রতি-বস্তুর লক নেই। সুতরাং class IntWrapper { int x; public: IntWrapper(int); ... };
অবজেক্টগুলির জন্য প্লেইন int
এসের চেয়ে বেশি স্থানের প্রয়োজন নেই এবং সংগ্রহ এবং অন্যান্য অবজেক্টগুলিতে সরাসরি (অর্থাত্ নির্দেশনা ছাড়াই) স্থাপন করা যায়।
অ্যারেগুলি জটিল কারণ কেবল সি ++ তে জাভা অ্যারের সমতুল্য কোনও প্রাক-তৈরি, সাধারণ সমতুল্য নেই। আপনি কেবলমাত্র একগুচ্ছ অবজেক্টগুলি বরাদ্দ করতে পারবেন new[]
(একেবারে কোনও ওভারহেড / মেটাডেটা ছাড়াই) তবে দৈর্ঘ্যের কোনও ক্ষেত্র নেই - বাস্তবায়ন সম্ভবত একটি সঞ্চয় করে তবে আপনি এটি অ্যাক্সেস করতে পারবেন না। std::vector
একটি গতিশীল অ্যারে এবং এর ফলে অতিরিক্ত ওভারহেড এবং আরও বড় ইন্টারফেস রয়েছে। std::array
এবং সি-স্টাইল অ্যারে (int arr[N];
), একটি সংকলন-সময় ধ্রুবক প্রয়োজন। তত্ত্বের ক্ষেত্রে, এটি কেবলমাত্র অবজেক্টের স্টোরেজ প্লাস দৈর্ঘ্যের জন্য একটি একক পূর্ণসংখ্যার হওয়া উচিত - তবে যেহেতু আপনি গতিশীল আকার পরিবর্তন করতে এবং খুব অল্প অতিরিক্ত জায়গার সাথে একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত ইন্টারফেস পেতে পারেন, তাই আপনি কেবল অনুশীলনে যান। মনে রাখবেন যে এগুলি এবং সেই সাথে সমস্ত অন্যান্য সংগ্রহগুলি মূল্য দ্বারা অবজেক্টগুলি সঞ্চয় করার জন্য ডিফল্ট, এইভাবে আপনার নির্দেশনা এবং রেফারেন্সের স্থান সংরক্ষণ করে এবং ক্যাশে আচরণের উন্নতি করে। ইন্ডিয়ারেশন পাওয়ার জন্য আপনাকে অবশ্যই পয়েন্টার (স্মার্ট ওয়ানস, প্লিজ) অবশ্যই সঞ্চয় করতে হবে।
উপরের তুলনাগুলি পুরোপুরি ন্যায্য নয়, কারণ এর মধ্যে কিছু সঞ্চয় জাভা অন্তর্ভুক্ত বৈশিষ্ট্যগুলি অন্তর্ভুক্ত না করে সরবরাহ করা হয় এবং তাদের সি ++ সমতুল্য প্রায়শই জাভা সমমানের (*) এর চেয়ে কম অপ্টিমাইজড হয়। সাধারণ উপায় বাস্তবায়ন virtual
ঠিক সাধারণ উপায় বাস্তবায়ন যতটা ওভারহেড যেমন সি ++ চাপিয়ে মধ্যে virtual
জাভা। একটি লক পেতে, আপনার একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত মুটেক্স অবজেক্টের প্রয়োজন, যা সম্ভবত কয়েকটি বিটের চেয়ে বড়। রেফারেন্স গণনা পেতে ( নাজিসির সমতুল্য, এবং এটি হিসাবে ব্যবহার করা উচিত নয়, তবে কখনও কখনও দরকারী), আপনার একটি স্মার্ট পয়েন্টার প্রয়োজন যা একটি রেফারেন্স গণনা ক্ষেত্র যুক্ত করে। অবজেক্টটি সাবধানতার সাথে নির্মিত না হলে রেফারেন্স গণনা, স্মার্ট পয়েন্টার অবজেক্ট এবং রেফারেন্স করা অবজেক্ট সম্পূর্ণ পৃথক স্থানে থাকে এবং আপনি যখন এটি সঠিকভাবে নির্মাণ করেন তখনও ভাগ করে নেওয়া পয়েন্টার (অবশ্যই?) একটির পরিবর্তে দুটি পয়েন্টার হতে পারে। তারপরে, ভাল সি ++ শৈলী এই বৈশিষ্ট্যগুলির পক্ষে এটি যথেষ্ট পরিমাণে ব্যবহার করে না - বাস্তবে, একটি লিখিত সি ++ গ্রন্থাগারের বস্তু কম ব্যবহার করে। এটি অগত্যা সামগ্রিকভাবে কম মেমরির ব্যবহার বোঝায় না , তবে এর অর্থ এই যে সি ++ এর ক্ষেত্রে এই বিষয়ে ভাল শুরু হয়।
(*) উদাহরণস্বরূপ, আপনি বিভিন্ন পতাকাগুলির সাথে প্রকারের তথ্যটি মার্জ করে এবং অবজেক্টের জন্য লক বিটগুলি মুছে ফেলার মাধ্যমে আপনি ভার্চুয়াল কলগুলি, পরিচয় হ্যাশ কোডগুলি এবং কিছু বস্তুর জন্য কেবলমাত্র একটি শব্দ দিয়ে লকিং (এবং অন্যান্য অনেকগুলি অবজেক্টের জন্য দুটি শব্দ) পেতে পারেন are লক প্রয়োজন হয় না। ডেভিড এফ বেকন, স্টিফেন জে ফিংক এবং ডেভিড গ্রোভ এবং এই অন্যান্য অপ্টিমাইজেশনের বিশদ ব্যাখ্যার জন্য স্পেস- এবং জাভা অবজেক্ট মডেল (পিডিএফ) এর সময়-দক্ষ বাস্তবায়ন দেখুন ।
int
? যদি তা হয় তবে আপনারint
জাভাতে এটি তুলনা করা উচিত ,Integer
যতক্ষণ না আপনার সি ++ ইনটগুলি 32 বিট হয়।