এটি স্বতঃস্ফূর্তভাবে একটি অদ্ভুত উত্তর না হলেও প্রায় কোনওটিই নয় এবং সম্ভবত সবার জন্য উপযুক্ত কোথাও নেই।
তবে আমার ব্যক্তিগত ক্ষেত্রে এটি নির্দিষ্ট, কেন্দ্রীয়, র্যান্ডম-অ্যাক্সেস সিক্যুয়েন্স (থ্রেড-নিরাপদ) সমস্ত নির্দিষ্ট উদাহরণ সংরক্ষণ করার পরিবর্তে এবং 32-বিট সূচকগুলি (আপেক্ষিক ঠিকানাগুলি, যেমন) দিয়ে কাজ করার জন্য আমার কাছে এত বেশি দরকারী বলে মনে হয়েছে বরং পরম পয়েন্টারগুলির চেয়ে বেশি।
একটি শুরুর জন্য:
- এটি -৪-বিট প্ল্যাটফর্মে অ্যানালগিকাল পয়েন্টারের মেমরির প্রয়োজনীয়তাগুলি অর্ধেক করে। এখনও অবধি আমার কোনও নির্দিষ্ট ডেটা টাইপের ~ 4.29 বিলিয়ন ডলারের বেশি প্রয়োজন নেই।
- এটি নিশ্চিত করে যে কোনও নির্দিষ্ট ধরণের সমস্ত উদাহরণ
T
, কখনও স্মৃতিতে খুব বেশি ছড়িয়ে যায় না। এটি সমস্ত ধরণের অ্যাক্সেস প্যাটার্নগুলির জন্য ক্যাশে মিসগুলি হ্রাস করতে পারে, এমনকি গাছের মতো লিঙ্কযুক্ত কাঠামোগুলিও যদি নোডারের পরিবর্তে সূচকগুলি ব্যবহার করে নোডগুলি সংযুক্ত করা হয় তবে তা অতিক্রম করে।
- সমান্তরাল ডেটা গাছ বা হ্যাশ টেবিলের পরিবর্তে সস্তা সমান্তরাল অ্যারে (বা স্পার্স অ্যারে) ব্যবহার করে সংযুক্ত হওয়া সহজ হয়ে যায়।
- সেট ছেদগুলি লিনিয়ার-টাইমে বা আরও ভাল ব্যবহার করে, একটি সমান্তরাল বিটসেট ব্যবহার করে পাওয়া যাবে।
- আমরা সূচকগুলি র্যাডিক্স করতে পারি এবং খুব ক্যাশে-বান্ধব অনুক্রমিক অ্যাক্সেস প্যাটার্ন পেতে পারি।
- একটি নির্দিষ্ট ডেটা টাইপের কী পরিমাণ উদাহরণ বরাদ্দ করা হয়েছে সে সম্পর্কে আমরা নজর রাখতে পারি।
- আপনি যদি এই ধরণের জিনিসটির প্রতি যত্নশীল হন তবে ব্যতিক্রম-সুরক্ষার মতো বিষয়গুলির সাথে মোকাবিলা করতে হবে এমন জায়গাগুলির সংখ্যা হ্রাস করে।
এটি বলেছে, সুবিধাবোধ একটি ক্ষয়ক্ষতি পাশাপাশি প্রকারের সুরক্ষা। আমরা ধারক এবং সূচি উভয়ইT
অ্যাক্সেস না করে এর উদাহরণ অ্যাক্সেস করতে পারি না । এবং একটি সরল পুরানো আমাদের কী ধরণের ডেটা টাইপ করে সে সম্পর্কে কিছুই জানায় না, তাই কোনও ধরণের সুরক্ষা নেই। আমরা দুর্ঘটনাক্রমে একটি সূচি ব্যবহার করে কোনও অ্যাক্সেস করার চেষ্টা করতে পারি । দ্বিতীয় সমস্যাটি প্রশমিত করতে আমি প্রায়শই এই ধরণের কাজটি করি:int32_t
Bar
Foo
struct FooIndex
{
int32_t index;
};
যা নির্বোধ বলে মনে হয় তবে এটি আমাকে প্রকারের সুরক্ষাটি ফিরিয়ে দেয় যাতে লোকেরা দুর্ঘটনাক্রমে সংকলক ত্রুটি ছাড়াই Bar
কোনও সূচকের মাধ্যমে Foo
একটিতে প্রবেশ করার চেষ্টা করতে পারে না । সুবিধার পক্ষে, আমি কেবল সামান্য অসুবিধা গ্রহণ করি।
লোকেদের জন্য একটি বড় অসুবিধা হতে পারে এটি হ'ল আমি ওওপি-স্টাইলের উত্তরাধিকার-ভিত্তিক বহুবর্ষ ব্যবহার করতে পারি না, যেহেতু এটি একটি বেস পয়েন্টারটির জন্য কল করবে যা বিভিন্ন আকার এবং প্রান্তিককরণের প্রয়োজনীয়তা সহ বিভিন্ন ধরণের সাব-টাইপগুলিকে নির্দেশ করতে পারে। তবে আমি আজকাল উত্তরাধিকারটি বেশি ব্যবহার করি না - ইসিএস পদ্ধতির পছন্দ করুন।
হিসাবে হিসাবে shared_ptr
, আমি এটি এত ব্যবহার না করার চেষ্টা করি। মালিকানা ভাগ করে নেওয়ার বিষয়টি আমি বেশিরভাগ সময়ই খুঁজে পাই না এবং এতো অবিস্মরণীয়ভাবে করা যৌক্তিক ফাঁস হতে পারে। প্রায়শই কমপক্ষে একটি উচ্চ স্তরের একটি জিনিস একটি জিনিসের সাথে সম্পর্কিত হয়। যেখানে আমি প্রায়শই এটি দেখতে লোভনীয় দেখতে পেলাম shared_ptr
যে জায়গাগুলিতে মালিকানা নিয়ে এতটা সত্যিকার অর্থে ডিল করা হয়নি এমন জায়গাগুলির মধ্যে এমন কোনও বস্তুর আজীবন প্রসার ঘটানো ছিল যেমন থ্রেডের কাজ শেষ হওয়ার আগে থ্রেডে কেবল স্থানীয় ফাংশনটি নিশ্চিত করা যায় না যা নিশ্চিত করা যায় এটি ব্যবহার করছি.
এই সমস্যাটি মোকাবেলা করার জন্য, shared_ptr
জিসি বা এর মতো কিছু ব্যবহার না করে আমি প্রায়শই একটি থ্রেড পুল থেকে চালিত স্বল্প-কালীন কাজের পক্ষে থাকি এবং যদি থ্রেডটি কোনও বিষয়টিকে ধ্বংস করার অনুরোধ করে তবে প্রকৃত ধ্বংসটি নিরাপদে স্থগিত হয়ে যায় সময় যখন সিস্টেমটি নিশ্চিত করতে পারে যে কোনও থ্রেডকে বলা বস্তুর ধরণের অ্যাক্সেসের প্রয়োজন নেই।
আমি এখনও মাঝে মাঝে রেফ-কাউন্টিং ব্যবহার করে শেষ করি না তবে এটিকে শেষ অবলম্বন কৌশলটির মতো আচরণ করি। এবং এমন কয়েকটি ঘটনা রয়েছে যেখানে অবিচ্ছিন্নভাবে ডেটা কাঠামোর প্রয়োগের মতো মালিকানা ভাগ করে নেওয়া সত্যই তা উপলব্ধি করে এবং সেখানে আমি এটি দেখতে পাই যে এই মুহুর্তে পৌঁছানোর উপযুক্ত ধারণাটি তৈরি shared_ptr
করে।
যাইহোক, আমি বেশিরভাগ সূচক ব্যবহার করি, এবং কাঁচা এবং স্মার্ট পয়েন্টারগুলি অল্প পরিমাণে ব্যবহার করি। আমি সূচকগুলি ও ধরণের দরজা পছন্দ করি যখন আপনি জানেন যে আপনার জিনিসগুলি নিখুঁতভাবে সংরক্ষণ করা হয়েছে, এবং স্মৃতির স্থান জুড়ে ছড়িয়ে নেই।