মুখবন্ধ
জাভা সি -+ এর মতো কিছুই নয়, হাইপির বিপরীতে। জাভা হাইপ মেশিনটি আপনাকে বিশ্বাস করতে চাইবে কারণ জাভাতে সি ++ এর মতো সি ++ রয়েছে, ভাষা একই রকম। সত্য থেকে আর কিছুই হতে পারে না। এই ভুল তথ্যটি যে কারণে জাভা প্রোগ্রামাররা সি ++ এ যান এবং তাদের কোডের নিদর্শনগুলি না বুঝে জাভা-জাতীয় সিনট্যাক্স ব্যবহার করেন তার একটি অংশ।
সামনে আমরা যাই
তবে কেন আমরা এইভাবে এটি করা উচিত তা আমি বুঝতে পারি না। আমি ধরে নেব এটি দক্ষতা এবং গতির সাথেই করতে হবে যেহেতু আমরা মেমরি ঠিকানায় সরাসরি অ্যাক্সেস পাই। আমি কি সঠিক?
বিপরীতে, আসলে। গাদা স্ট্যাকের চেয়ে অনেক ধীর গতির , কারণ স্তূপের তুলনায় স্ট্যাকটি খুব সহজ। স্বয়ংক্রিয় স্টোরেজ ভেরিয়েবলগুলি (ওরফে স্ট্যাক ভেরিয়েবলগুলি) সুযোগের বাইরে চলে গেলে তাদের ডেস্ট্রাক্টরদের ডাকা হয়। উদাহরণ স্বরূপ:
{
std::string s;
}
// s is destroyed here
অন্যদিকে, আপনি যদি গতিশীলভাবে বরাদ্দকৃত পয়েন্টার ব্যবহার করেন তবে এর ডেস্ট্রাক্টরকে ম্যানুয়ালি কল করতে হবে। delete
এই ধ্বংসকারীকে আপনার জন্য কল করে।
{
std::string* s = new std::string;
}
delete s; // destructor called
new
সি # এবং জাভাতে প্রচলিত সিনট্যাক্সের সাথে এর কোনও যোগসূত্র নেই। এগুলি সম্পূর্ণ ভিন্ন উদ্দেশ্যে ব্যবহৃত হয়।
গতিশীল বরাদ্দের সুবিধা
1. আপনাকে আগে থেকে অ্যারের আকার জানতে হবে না
অনেক সি ++ প্রোগ্রামার প্রথম যে সমস্যাগুলির মধ্যে চলে সেগুলির মধ্যে একটি হ'ল তারা যখন ব্যবহারকারীদের থেকে স্বেচ্ছাসেবক ইনপুট গ্রহণ করে, আপনি কেবল স্ট্যাক ভেরিয়েবলের জন্য একটি নির্দিষ্ট আকার বরাদ্দ করতে পারেন। আপনি অ্যারে আকার পরিবর্তন করতে পারবেন না। উদাহরণ স্বরূপ:
char buffer[100];
std::cin >> buffer;
// bad input = buffer overflow
অবশ্যই, যদি আপনি এর std::string
পরিবর্তে ব্যবহার করেন তবে std::string
অভ্যন্তরীণভাবে নিজেকে পুনরায় আকার দেয় যাতে কোনও সমস্যা না হয়। তবে মূলত এই সমস্যার সমাধান হ'ল গতিশীল বরাদ্দ। আপনি ব্যবহারকারীর ইনপুট উপর ভিত্তি করে গতিশীল মেমরি বরাদ্দ করতে পারেন, উদাহরণস্বরূপ:
int * pointer;
std::cout << "How many items do you need?";
std::cin >> n;
pointer = new int[n];
পার্শ্ব দ্রষ্টব্য : বহু প্রাথমিকের এক ভুলটি হ'ল পরিবর্তনশীল দৈর্ঘ্যের অ্যারে ব্যবহার। এটি একটি জিএনইউ এক্সটেনশন এবং ঝনঝনায় একটি কারণ তারা জিসিসির অনেকগুলি এক্সটেনশানকে মিরর করে। সুতরাং নিম্নলিখিত
int arr[n]
উপর নির্ভর করা উচিত নয়।
গাদা স্ট্যাকের চেয়ে অনেক বড়, যেহেতু তার নিজের প্রয়োজন মতো মেমরি নির্বিচারে বরাদ্দ / পুনর্বিবেচনা করতে পারে, অন্যদিকে স্ট্যাকের সীমাবদ্ধতা রয়েছে।
2. অ্যারে পয়েন্টার নয়
এটি কীভাবে আপনি জিজ্ঞাসা একটি সুবিধা? অ্যারে এবং পয়েন্টারগুলির পিছনে বিভ্রান্তি / পৌরাণিক কাহিনী বুঝতে পারলে উত্তরটি পরিষ্কার হয়ে যাবে। সাধারণত ধারণা করা হয় যে এগুলি একই, তবে তারা তা নয়। এই পৌরাণিক কাহিনীটি এ থেকে আসে যে পয়েন্টারগুলি ঠিক অ্যারেগুলির মতো সাবস্ক্রিপশন করা যায় এবং কোনও ক্রয়ের ঘোষণায় শীর্ষ স্তরের পয়েন্টারগুলিতে অ্যারে ক্ষয় হওয়ার কারণে of যাইহোক, একবার অ্যারে কোনও পয়েন্টারের সিদ্ধান্ত নেয়, পয়েন্টারটি তার sizeof
তথ্য হারিয়ে ফেলে । সুতরাং sizeof(pointer)
বাইটগুলিতে পয়েন্টারের আকার দেবে যা সাধারণত 64৪-বিট সিস্টেমে 8 বাইট হয়।
আপনি অ্যারেগুলিকে বরাদ্দ করতে পারবেন না, কেবল তাদের আরম্ভ করুন। উদাহরণ স্বরূপ:
int arr[5] = {1, 2, 3, 4, 5}; // initialization
int arr[] = {1, 2, 3, 4, 5}; // The standard dictates that the size of the array
// be given by the amount of members in the initializer
arr = { 1, 2, 3, 4, 5 }; // ERROR
অন্যদিকে, আপনি পয়েন্টারগুলির সাথে যা কিছু করতে চান তা করতে পারেন। দুর্ভাগ্যক্রমে, যেহেতু পয়েন্টার এবং অ্যারেগুলির মধ্যে পার্থক্যটি জাভা এবং সি # তে হাতে-ওয়েভ করা হয়েছে, আর নতুনরা পার্থক্য বুঝতে পারে না।
৩. পলিমারফিজম
জাভা এবং সি # এর সুবিধাগুলি রয়েছে যা আপনাকে বস্তুটিকে অন্য হিসাবে বিবেচনা করার অনুমতি দেয়, উদাহরণস্বরূপ as
কীওয়ার্ডটি ব্যবহার করে । সুতরাং যদি কেউ কোনও Entity
অবজেক্টকে একটি অবজেক্ট হিসাবে বিবেচনা Player
করতে চায় তবে Player player = Entity as Player;
এটি করতে পারে আপনি যদি একটি একজাতীয় ধারকটিতে ফাংশন কল করতে চান যা কেবলমাত্র একটি নির্দিষ্ট ধরণের ক্ষেত্রে প্রয়োগ করা উচিত। কার্যকারিতা নীচে অনুরূপ ফ্যাশনে অর্জন করা যেতে পারে:
std::vector<Base*> vector;
vector.push_back(&square);
vector.push_back(&triangle);
for (auto& e : vector)
{
auto test = dynamic_cast<Triangle*>(e); // I only care about triangles
if (!test) // not a triangle
e.GenericFunction();
else
e.TriangleOnlyMagic();
}
সুতরাং বলুন যে কেবল ত্রিভুজগুলির কোনও ঘোরানো ফাংশন থাকলে, আপনি এটি ক্লাসের সমস্ত অবজেক্টে কল করার চেষ্টা করলে এটি সংকলক ত্রুটি হবে। ব্যবহার করে dynamic_cast
আপনি as
কীওয়ার্ড অনুকরণ করতে পারেন । পরিষ্কার হওয়ার জন্য, যদি কোনও কাস্ট ব্যর্থ হয়, তবে এটি একটি অবৈধ পয়েন্টার দেয়। সুতরাং !test
মূলত test
NUL বা একটি অবৈধ পয়েন্টার কিনা তা যাচাই করার জন্য একটি শর্টহ্যান্ড হ'ল যার অর্থ কাস্ট ব্যর্থ হয়েছে।
স্বয়ংক্রিয় ভেরিয়েবলের সুবিধা
গতিশীল বরাদ্দ করতে পারে এমন দুর্দান্ত জিনিসগুলি দেখার পরে, আপনি সম্ভবত ভাবছেন যে কেন কেউ সার্বক্ষণিক গতিশীল বরাদ্দ ব্যবহার করবেন না? আমি ইতিমধ্যে আপনাকে একটি কারণ বলেছি, গাদাটি ধীরে ধীরে। এবং যদি আপনার এই সমস্ত মেমরির প্রয়োজন না হয় তবে আপনার এটির অপব্যবহার করা উচিত নয়। সুতরাং এখানে কোনও বিশেষ ক্রমে কিছু অসুবিধা রয়েছে:
এটি ত্রুটিযুক্ত ম্যানুয়াল মেমরি বরাদ্দ বিপজ্জনক এবং আপনি ফাঁস হওয়ার ঝুঁকিতে আছেন। আপনি যদি ডিবাগার বা valgrind
(একটি মেমরি ফাঁসের সরঞ্জাম) ব্যবহারে দক্ষ না হন তবে আপনি আপনার চুলগুলি আপনার মাথা থেকে টানতে পারেন। ভাগ্যক্রমে RAII আইডিয়াম এবং স্মার্ট পয়েন্টারগুলি এটিকে কিছুটা কমিয়ে দেয় তবে আপনাকে অবশ্যই নিয়মের তিনটি এবং পাঁচটির নিয়ম হিসাবে অনুশীলনের সাথে পরিচিত হতে হবে। এটি নেওয়া অনেক তথ্য, এবং যেসব শিখর তারা জানেন না বা যত্ন করে না তারা এই ফাঁদে পড়বে।
এটি র কোন দরকার নাই. জাভা এবং সি # এর বিপরীতে যেখানে যে কোনও new
জায়গায় কীওয়ার্ডটি ব্যবহার করা আইডিয়োমেটিক , সি ++ তে, আপনার প্রয়োজন হলে আপনার কেবল এটি ব্যবহার করা উচিত। সাধারণ বাক্যাংশটি যায়, হাতুড়ি থাকলে সবই পেরেকের মতো লাগে। যেখানে সি ++ দিয়ে শুরু করা সূচকগুলি পয়েন্টারগুলি দেখে ভয় পায় এবং অভ্যাস অনুসারে স্ট্যাক ভেরিয়েবলগুলি ব্যবহার করতে শেখে, জাভা এবং সি # প্রোগ্রামাররা এটি না বুঝে পয়েন্টার ব্যবহার করে শুরু করে! এটি আক্ষরিকভাবে ভুল পায়ে পা রেখে চলেছে। আপনার জানা সমস্ত কিছু আপনাকে অবশ্যই ত্যাগ করতে হবে কারণ বাক্য গঠনটি একটি জিনিস, ভাষা শেখা অন্য জিনিস।
1. (এন) আরভিও - আক, (নামযুক্ত) রিটার্ন মান অপ্টিমাইজেশন
এক অপ্টিমাইজেশান অনেক কম্পাইলার করা জিনিষ বলা হয় বিলোপ এবং ফেরত মান অপ্টিমাইজেশান । এই জিনিসগুলি অপ্রয়োজনীয় অনুলিপিগুলিকে অপসারণ করতে পারে যা খুব বড় আকারের বস্তুর জন্য দরকারী যেমন অনেক উপাদান রয়েছে এমন ভেক্টর। সাধারণত সাধারণ চর্চা পয়েন্টার ব্যবহার করা মালিকানা হস্তান্তর বরং বড় বস্তু অনুলিপি চেয়ে সরাতে তাদের চারপাশে। এটি মুভ সিমানটিকস এবং স্মার্ট পয়েন্টারগুলির সূচনার দিকে পরিচালিত করে ।
আপনি যদি পয়েন্টার ব্যবহার করেন তবে (এন) আরভিও ঘটে না । আপনি যদি অপ্টিমাইজেশন সম্পর্কে উদ্বিগ্ন হন তবে পয়েন্টারগুলি ফিরে বা পাসের পরিবর্তে (এন) আরভিওর সুবিধা নেওয়া আরও বেশি সুবিধাজনক এবং কম ত্রুটিযুক্ত pr ত্রুটি ফাঁস ঘটতে পারে যদি কোনও ফাংশনের কলার delete
গতিশীল বরাদ্দকৃত বস্তু এবং এই জাতীয় জন্য দায়বদ্ধ থাকে । যদি কোনও গরম আলুর মতো পয়েন্টারগুলি পাশ কাটিয়ে দেওয়া হয় তবে কোনও সামগ্রীর মালিকানা ট্র্যাক করা কঠিন। কেবল স্ট্যাক ভেরিয়েবলগুলি ব্যবহার করুন কারণ এটি সহজ এবং আরও ভাল।