সি ++ গ্রন্থাগার এবং ফ্রেমওয়ার্কগুলি কখনই স্মার্ট পয়েন্টার ব্যবহার করে না?


156

আমি কয়েকটি নিবন্ধে পড়েছি যে কাঁচা পয়েন্টার প্রায় কখনও ব্যবহার করা উচিত নয়। পরিবর্তে সেগুলি সর্বদা স্মার্ট পয়েন্টারগুলির মধ্যে আবৃত করা উচিত, তা স্কপড বা ভাগ করা পয়েন্টার।

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

যখন অনেক বড় প্রকল্পগুলি এড়ানো মনে হয় তখন স্মার্ট পয়েন্টার কেন সুপারিশ করা হয় তা অবাক করেই ভাবছি।


22
আপনার সদ্য নামকরণ করা লাইব্রেরিগুলির অনেকগুলি বহু বছর আগে শুরু হয়েছিল। স্মার্ট পয়েন্টারগুলি কেবলমাত্র C ++ 11 এ সত্যই মানক হয়ে উঠেছে।
খ্রিস্টিয়াকক

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

93
@ এডিশিল: আপনার পায়ের চারপাশে শিখাগুলি চাটতে লাগার কারণ হ'ল আপনি সর্বদাই পুরোপুরি ভুল। উদাহরণস্বরূপ, কোন ওভারহেড ভিতরে আছে unique_ptr? কেউ কিছু. এম্বেড করা বা রিয়েল টাইম সিস্টেমগুলি কি কিউটি / ডাব্লুএক্সউজেডসকে লক্ষ্যযুক্ত করা হয়? না, তারা উইন্ডোজ / ম্যাক / ইউনিক্সের জন্য ডেস্কটপে সর্বাধিক- স্মার্ট পয়েন্টারগুলি প্রোগ্রামারদের জন্য যারা এটি সঠিক করতে চান।
কুকুরছানা

24
সত্যিই, মোবাইল ফোনগুলি জাভা চলছে।
আর মার্টিনহো ফার্নান্দেস

12
স্মার্ট পয়েন্টারগুলি কেবলমাত্র সি ++ 11 এ সত্যই মান? কি??? এই জিনিসগুলি 20 বছরেরও বেশি সময় ধরে ব্যবহৃত হচ্ছে।
কাজ

উত্তর:


124

স্ট্যান্ডার্ড স্মার্ট পয়েন্টারগুলির আবির্ভাবের আগে অনেকগুলি গ্রন্থাগার রচিত ছিল তা বাদ দিয়ে সম্ভবত সবচেয়ে বড় কারণ সম্ভবত একটি স্ট্যান্ডার্ড সি ++ অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (এবিআই) এর অভাব।

আপনি যদি কেবল শিরোনামের পাঠাগারটি লিখছেন তবে আপনি স্মার্ট পয়েন্টার এবং স্ট্যান্ডার্ড পাত্রে আপনার হৃদয়ের সামগ্রীতে যেতে পারেন। তাদের উত্সটি আপনার গ্রন্থাগারে সংকলনের সময় উপলভ্য, সুতরাং আপনি কেবল তাদের ইন্টারফেসের স্থায়িত্বের উপর নির্ভর করেন, তাদের বাস্তবায়ন নয়।

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

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

সি ++ এর জন্য পরিস্থিতি তেমন ভাল নয়। পৃথক সংকলকগণ তাদের নিজস্ব বাইনারিগুলির মধ্যে আন্তঃসংযোগ পরিচালনা করতে পারে, তাই আপনার কাছে প্রতিটি সমর্থিত সংকলক, প্রায়শই GCC এবং MSVC এর জন্য একটি সংস্করণ বিতরণের বিকল্প রয়েছে। তবে এর আলোকে, বেশিরভাগ লাইব্রেরি কেবল একটি সি ইন্টারফেস রফতানি করে that যার অর্থ কাঁচা পয়েন্টার।

নন-লাইব্রেরি কোডটি অবশ্য সাধারণত কাঁচার চেয়ে স্মার্ট পয়েন্টার পছন্দ করে।


17
আমি আপনার সাথে একমত, এমনকি একটি স্টাড :: স্ট্রিং পাস করা ব্যথা হতে পারে, এটি "লাইব্রেরির জন্য দুর্দান্ত ভাষা" হিসাবে সি ++ সম্পর্কে অনেক কিছু বলে।
11

8
নীচের লাইনটি আরও পছন্দ: আপনি যদি একটি প্রাক বিল্ড সংস্করণ বিতরণ করতে চান তবে আপনাকে যে প্রতিটি সংকলক সমর্থন করতে চান তার জন্য আপনাকে এটি করতে হবে।
জোসেফএক্স

6
@ জোসেফএক্স: হ্যাঁ এটি দুঃখজনক হলেও সত্য, একমাত্র বিকল্প হ'ল সিওএম বা একটি কাঁচা সি ইন্টারফেস। আমি চাই সি ++ কমতি এই ধরণের সমস্যার জন্য উদ্বেগ শুরু করবে। আমি বলতে চাইছি এটি 2 বছর আগের সি ++ এর মতো নতুন ভাষা নয়।
রোবট মেস

3
আমি হ্রাস পেয়েছি কারণ এটি ভুল। এবিআই বিষয়গুলি বেশিরভাগ ক্ষেত্রে পরিচালনার চেয়ে বেশি। খুব কমই ব্যবহারকারী-বান্ধব, এবিআই খুব কমই দুর্লভ।
কুকুরছানা

4
@ নাথানএডামস: এই জাতীয় সফটওয়্যার নিঃসন্দেহে চিত্তাকর্ষক এবং দরকারী। তবে এটি গভীর সমস্যার লক্ষণ হিসাবে বিবেচনা করে: আজীবন এবং মালিকানার সি ++ শব্দার্থবিজ্ঞান দরিদ্র এবং অস্তিত্বের মধ্যে কোথাও না। ভাষাগুলি যদি তাদের অনুমতি না দেয় তবে এই হিপ বাগগুলি ওঠেনি। সুতরাং নিশ্চিত, স্মার্ট পয়েন্টারগুলি কোনও প্যানিসিয়া নয় — তারা প্রথমে সি ++ ব্যবহার করে যে ক্ষতি হয়েছে তার কিছুটা পুনরুদ্ধার করার চেষ্টা।
জন পূর্দি

40

এর অনেক কারণ থাকতে পারে। তাদের কয়েকটি তালিকা করতে:

  1. স্মার্ট পয়েন্টারগুলি সম্প্রতি সম্প্রতি স্ট্যান্ডার্ডের অংশে পরিণত হয়েছে। ততক্ষণে তারা অন্যান্য গ্রন্থাগারের অংশ ছিল
  2. তাদের প্রাথমিক ব্যবহার মেমরি ফুটো এড়ানোর জন্য; অনেক লাইব্রেরির নিজস্ব মেমরি পরিচালনা নেই; সাধারণত তারা ইউটিলিটি এবং এপিআই সরবরাহ করে
  3. এগুলি মোড়ক হিসাবে বাস্তবায়িত হয়, যেহেতু তারা আসলে বস্তুগুলি এবং পয়েন্টার নয়। কাঁচা পয়েন্টারগুলির তুলনায় যার অতিরিক্ত সময় / স্থান ব্যয় হয়; গ্রন্থাগারগুলির ব্যবহারকারীরা এ জাতীয় ওভারহেড রাখতে চান না

সম্পাদনা : স্মার্ট পয়েন্টার ব্যবহার করা সম্পূর্ণ বিকাশকারীদের পছন্দ। এটি বিভিন্ন কারণের উপর নির্ভর করে।

  1. কর্মক্ষমতা সমালোচনামূলক সিস্টেমে আপনি স্মার্ট পয়েন্টারগুলি ব্যবহার করতে চাইবেন না যা ওভারহেড উত্পন্ন করে

  2. যে প্রকল্পটির পশ্চাদপটে সামঞ্জস্য প্রয়োজন, আপনি স্মার্ট পয়েন্টারগুলি ব্যবহার করতে নাও চান যাতে সি ++ 11 নির্দিষ্ট বৈশিষ্ট্য রয়েছে

সম্পাদনা 2 নীচে উত্তীর্ণ হওয়ার কারণে 24 ঘন্টার ব্যবধানে বেশ কয়েকটি ডাউনভোটের স্ট্রিং রয়েছে। উত্তরটি কেন নিম্নচোট করা হয়েছে তা বুঝতে আমি ব্যর্থ হই যদিও নীচে কেবল একটি অ্যাড-অন পরামর্শ এবং উত্তর নয়।
তবে সি ++ আপনাকে সর্বদা বিকল্পগুলি খোলা রাখতে সহায়তা করে। :) উদা

template<typename T>
struct Pointer {
#ifdef <Cpp11>
  typedef std::unique_ptr<T> type;
#else
  typedef T* type;
#endif
};

এবং আপনার কোডে এটি ব্যবহার করুন:

Pointer<int>::type p;

যারা বলেন যে স্মার্ট পয়েন্টার এবং কাঁচা পয়েন্টার আলাদা, আমি তার সাথে একমত। উপরের কোডটি কেবল একটি ধারণা ছিল যেখানে কেউ এমন একটি কোড লিখতে পারে যা কেবল একটি দিয়ে বিনিময়যোগ্য, এটি বাধ্যবাধকতা#define নয় ;

উদাহরণস্বরূপ, T*স্পষ্টভাবে মুছতে হবে তবে স্মার্ট পয়েন্টারটি তা করে না। আমরা এটি Destroy()হ্যান্ডেল করার জন্য একটি শিখরযুক্ত হতে পারে।

template<typename T>
void Destroy (T* p)
{
  delete p;
}
template<typename T>
void Destroy (std::unique_ptr<T> p)
{
  // do nothing
}

এবং এটি হিসাবে ব্যবহার করুন:

Destroy(p);

একইভাবে, কোনও কাঁচা পয়েন্টারের জন্য আমরা এটি সরাসরি অনুলিপি করতে পারি এবং স্মার্ট পয়েন্টারটির জন্য আমরা বিশেষ ক্রিয়াকলাপ ব্যবহার করতে পারি।

Pointer<X>::type p = new X;
Pointer<X>::type p2(Assign(p));

যেখানে Assign()হিসাবে:

template<typename T>
T* Assign (T *p)
{
  return p;
}
template<typename T>
... Assign (SmartPointer<T> &p)
{
  // use move sematics or whateve appropriate
}

14
৩. কিছু স্মার্ট পয়েন্টারগুলির অতিরিক্ত সময় / স্থানের ব্যয় থাকে, অন্যরা std::auto_ptrদীর্ঘকাল ধরে স্ট্যান্ডার্ডের অংশ না করে (এবং লক্ষ্য রাখবেন, আমি std::auto_ptrবস্তু তৈরির ফাংশনগুলির জন্য রিটার্ন টাইপ হিসাবে পছন্দ করি না কেন অন্য কোথাও প্রায় অকেজো)। সি ++ এ 11 std::unique_ptrএর সরল পয়েন্টারটির অতিরিক্ত কোনও খরচ নেই।
ডেভিড রদ্রিগেজ - ড্রিবিয়াস

4
হুবহু ... উপস্থিতি unique_ptrএবং অদৃশ্য হওয়ার একটি দুর্দান্ত প্রতিসাম্য রয়েছে auto_ptr, কোডটি C ++ 03 পরে ব্যবহার করা উচিত, যখন কোডটি C ++ 11 ব্যবহার করে এটি পূর্ব ব্যবহার করতে পারে। স্মার্ট পয়েন্টার হয় না shared_ptr অনেক মান এবং মান প্রস্তাব যে প্রত্যাখ্যাত হয়েছিল সহ কেউই মান আছে,managed_ptr
dribeas - ডেভিড রদ্রিগেজ

2
@ আইম্মিলিন্ড, সেগুলি আকর্ষণীয় বিষয়, তবে মজার বিষয়টি হ'ল আমরা যদি স্মার্ট পয়েন্টার ব্যবহার করে শেষ করি, যেমন সম্ভবত অনেকেই সুপারিশ করেন, আমরা বড় লাইব্রেরিগুলির সাথে বেমানান কোড তৈরি করি। অবশ্যই, আমরা স্মার্ট পয়েন্টারগুলিকে প্রয়োজনীয়ভাবে মোড় / মোড়ক করতে পারি তবে এটি অনেক ঝামেলার মতো মনে হয় এবং অসামঞ্জস্যপূর্ণ কোড তৈরি করে (কখনও কখনও আমরা স্মার্ট পয়েন্টারগুলির সাথে ডিল করি, কখনও না)।
লরেন্ট

7
স্মার্ট পয়েন্টারগুলির "অতিরিক্ত সময় / স্থানের ব্যয়" থাকা বিবৃতিটি কিছুটা বিভ্রান্তিকর; unique_ptrরানটাইম ব্যয় ব্যতীত সমস্ত স্মার্ট পয়েন্টার , তবে unique_ptrএটি সবচেয়ে বেশি ব্যবহৃত হয় যা সবচেয়ে বেশি ব্যবহৃত হয়। আপনার দেওয়া কোড নমুনাটিও বিভ্রান্তিমূলক, কারণ unique_ptrএবং T*এটি সম্পূর্ণ আলাদা ধারণা। আপনি উভয়কেই যে হিসাবে উল্লেখ করেছেন তা typeএই ধারণাটি দেয় যে তারা একে অপরের জন্য সরে যেতে পারে।
অকার্যকর-পয়েন্টার

12
আপনি এটির মতো টাইপইফ করতে পারবেন না, এই ধরণেরগুলি কোনওভাবেই সমতুল্য নয়। এভাবে টাইপডেফ লিখতে ঝামেলা চাইছে।
অ্যালেক্স বি

35

স্মার্ট পয়েন্টারগুলির সাথে দুটি সমস্যা রয়েছে (প্রাক সি ++ 11):

  • মানসম্মত নয়, সুতরাং প্রতিটি গ্রন্থাগার তার নিজস্ব পুনরায় উদ্ভাবন করতে পারে (এনআইএইচ সিন্ড্রোম এবং নির্ভরতার বিষয়গুলি)
  • সম্ভাব্য ব্যয়

ডিফল্ট স্মার্ট পয়েন্টার মধ্যে এটি মাগনা হয়, unique_ptr। দুর্ভাগ্যক্রমে এর জন্য সি ++ 11 সরানো শব্দার্থক প্রয়োজন, যা কেবল সম্প্রতি উপস্থিত হয়েছিল appeared অন্যান্য সমস্ত স্মার্ট পয়েন্টারগুলির ব্যয় ( shared_ptr, intrusive_ptr) বা আদর্শ শব্দার্থবিজ্ঞানের ( auto_ptr) এর চেয়ে কম থাকে ।

C ++ 11 কোণার চারপাশে, একটি এনে std::unique_ptr, একজনকে ভাবতে প্ররোচিত করা হবে যে শেষ পর্যন্ত এটি শেষ হয়ে গেছে ... আমি তেমন আশাবাদী নই।

কেবলমাত্র কয়েকটি বড় সংকলক বেশিরভাগ সি ++ 11 প্রয়োগ করে এবং কেবল তাদের সাম্প্রতিক সংস্করণগুলিতে। আমরা আশা করতে পারি যে কিউটি এবং বুস্টের মতো বড় লাইব্রেরিগুলি কিছু সময়ের জন্য সি ++ 03 এর সাথে সামঞ্জস্য বজায় রাখতে রাজি হবে, যা কিছুটা নতুন এবং চকচকে স্মার্ট পয়েন্টারগুলির বিস্তৃত গ্রহণকে বাধা দেয়।


12

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

গ্রন্থাগারগুলি হয় কেবলমাত্র একটি মান ফেরত দেয় বা কোনও বস্তুকে পপুলেশন করে। তাদের কাছে সাধারণত এমন অনেকগুলি জিনিস থাকে না যা প্রচুর জায়গায় ব্যবহার করা প্রয়োজন, তাই তাদের স্মার্ট পয়েন্টার ব্যবহার করার প্রয়োজন নেই (কমপক্ষে তাদের ইন্টারফেসে নয়, তারা এগুলি অভ্যন্তরীণভাবে ব্যবহার করতে পারে)।

আমি উদাহরণস্বরূপ আমরা যে লাইব্রেরিতে কাজ করছি তা গ্রহণ করতে পারি, যেখানে কয়েক মাস বিকাশের পরে আমি বুঝতে পারি যে আমরা কয়েকটি ক্লাসে কেবলমাত্র পয়েন্টার এবং স্মার্ট পয়েন্টার ব্যবহার করেছি (সমস্ত শ্রেণির 3-5%)।

বেশিরভাগ জায়গায় রেফারেন্স অনুসারে ভেরিয়েবলগুলি পাস করা যথেষ্ট ছিল, আমরা যখনই আমাদের কাছে কোনও বস্তু নਾਲ হতে পারে এবং স্মার্ট পয়েন্টার এবং কাঁচা পয়েন্টার ব্যবহার করি যখন আমাদের ব্যবহৃত লাইব্রেরি আমাদের বাধ্য করে forced

সম্পাদনা (আমার খ্যাতির কারণে আমি মন্তব্য করতে পারি না): রেফারেন্স অনুসারে ভেরিয়েবলগুলি পাস করা খুব নমনীয়: আপনি যদি অবজেক্টটি কেবল পঠন করতে চান তবে আপনি একটি দৃ const় রেফারেন্স ব্যবহার করতে পারেন (আপনি এখনও কিছু দুষ্টু কাস্টস অবজেক্ট লিখতে সক্ষম করতে পারেন) ) তবে আপনি সর্বোচ্চ সুরক্ষা পেতে পারেন (এটি স্মার্ট পয়েন্টারগুলির সাথে একই)। তবে আমি সম্মত হই না যে কেবলমাত্র বস্তুটি ফিরিয়ে দেওয়া এটি বেশ সুন্দর।


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

2
আপনার কাছে কনস্টেশন রয়েছে (মনে হয় আমি মন্তব্য করতে পারি: ডি)।
রোবট মেস

9

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

বুস্ট হিসাবে, আমি সম্পূর্ণরূপে আশা করি যে তারা উপযুক্ত যেখানেই স্মার্ট পয়েন্টার ব্যবহার করে। আপনি আরও নির্দিষ্ট হতে পারে।

তদ্ব্যতীত, ভুলে যাবেন না যে মালিকানা প্রয়োগের জন্য স্মার্ট পয়েন্টার রয়েছে। যদি এপিআই-এর কোনও মালিকানাধীন শব্দার্থবিজ্ঞান না থাকে তবে কেন স্মার্ট পয়েন্টার ব্যবহার করবেন?


19
কিউটি লেখা ছিল প্ল্যাটফর্মগুলি যেগুলি ব্যবহার করতে চেয়েছিল তার যথেষ্ট কার্যকারিতা যথেষ্ট পরিমাণে আগে ছিল। এটির দীর্ঘকাল ধরে স্মার্ট পয়েন্টার রয়েছে এবং প্রায় সব কিউ * ক্লাসে সম্পদের অন্তর্ভুক্ত ভাগ করে নেওয়ার জন্য এগুলি ব্যবহার করে।
রুবেনভ বিবি

6
প্রতিটি জিইউআই লাইব্রেরি অকারণে চাকাটি পুনরায় সজ্জিত করে। এমনকি স্ট্রিং, কিউটি রয়েছে QString, ডাব্লুএক্সউইজেডস রয়েছে wxString, এমএফসি এর মারাত্মক নামকরণ করেছে CString। কোন ইউটিএফ -8 জিওআইয়ের std::string99% কাজের জন্য যথেষ্ট ভাল নয় ?
বিপরীত

10
@ বিপরীত কিউ স্ট্রিং তৈরি করা হয়েছিল যখন এসটিডি :: স্ট্রিংটি প্রায় ছিল না।
মিস্টারফক্স

কখন কিউটি তৈরি করা হয়েছিল এবং সেই সময়ে কোন স্মার্ট পয়েন্টার উপলব্ধ ছিল তা পরীক্ষা করে দেখুন।
ডাইনিয়াস

3

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

কেউ সন্দেহ করে যে কিছু বা বেশিরভাগ একই লেখক ময়লা আবর্জনা সংগ্রহকারী মেমরি পরিচালকদের পছন্দ করেন। আমি না, তবে আমি তাদের চেয়ে আলাদা মনে করি।

স্মার্ট পয়েন্টার দুর্দান্ত, তবে তাদের রেফারেন্স গণনা রাখতে হবে। রেফারেন্স গণনা রক্ষণ মূল্য বহন করে - প্রায়শই ব্যয়বহুল ব্যয়, তবুও ব্যয় হয় - রানটাইমের সময়। খালি পয়েন্টার ব্যবহার করে এই ব্যয়গুলি সংরক্ষণে কোনও ভুল নেই, বিশেষত যদি পয়েন্টারগুলি ডেস্ট্রাক্টর দ্বারা পরিচালিত হয়।

সি ++ সম্পর্কে একটি দুর্দান্ত জিনিস হ'ল এটি এম্বেডড-সিস্টেম প্রোগ্রামিংয়ের জন্য সমর্থন। খালি পয়েন্টার ব্যবহার এরই একটি অংশ।

আপডেট: একজন মন্তব্যকারী সঠিকভাবে পর্যবেক্ষণ করেছেন যে সি ++ এর নতুন unique_ptr(টিআর 1 থেকে উপলব্ধ) উল্লেখগুলি গণনা করে না। কমেন্টারটির "স্মার্ট পয়েন্টার" এর আলাদা ধারণাও আমার মনে আছে I তিনি সংজ্ঞা সম্পর্কে সঠিক হতে পারে।

আরও আপডেট: নীচের মন্তব্যের থ্রেডটি আলোকিত করছে। এটি সব পড়ার সুপারিশ করা হয়।


2
শুরু করার জন্য, এম্বেডড-সিস্টেম প্রোগ্রামিং সমস্ত প্রোগ্রামিংয়ের একটি বিশাল সংখ্যালঘু এবং বেশ অপ্রাসঙ্গিক। সি ++ একটি সাধারণ উদ্দেশ্যমূলক ভাষা purpose দ্বিতীয়ত, shared_ptrএকটি রেফারেন্স গণনা রাখে। আরও অনেক স্মার্ট পয়েন্টার প্রকার রয়েছে যা রেফারেন্স গণনা একেবারেই রাখে না। অবশেষে, উল্লিখিত গ্রন্থাগারগুলি প্ল্যাটফর্মগুলিতে লক্ষ্যবস্তু করা হয়েছে যার এড়াতে প্রচুর সংস্থান রয়েছে। আমি যে সর্বনাশক ছিলাম তা নয়, তবে আমি যা বলছি তা হ'ল আপনার পোস্টটি ভুল দ্বারা পূর্ণ।
কুকুরছানা 13

2
@thb - আমি আপনার সাথে সংবেদন সহ একমত। ডেডএমজি - দয়া করে এম্বেড থাকা সিস্টেম ছাড়া বাঁচার চেষ্টা করুন। হ্যাঁ - কিছু স্মার্ট পয়েন্টারগুলির ওভারহেড থাকে না তবে কিছু থাকে। ওপিতে গ্রন্থাগারগুলির উল্লেখ রয়েছে। বুস্টের উদাহরণস্বরূপ এমন অংশ রয়েছে যা এমবেডেড সিস্টেমগুলি ব্যবহার করে - তবে স্মার্ট পয়েন্টারগুলি নির্দিষ্ট অ্যাপ্লিকেশনগুলির জন্য অনুপযুক্ত হতে পারে।
এড হিল

2
@ এডিহেল: এম্বেডড সিস্টেম ব্যতীত বাঁচেন না! = তাদের জন্য প্রোগ্রামিং কোনও ক্ষুদ্র, অপ্রাসঙ্গিক, সংখ্যালঘু নয়। স্মার্ট পয়েন্টার প্রতিটি পরিস্থিতিতে যেখানে আপনার কোনও সামগ্রীর জীবনকাল পরিচালনা করতে হবে তার জন্য উপযুক্ত।
কুকুরছানা

4
shared_ptrওভারহেড নেই এটি কেবলমাত্র যদি ওপরে থাকে তবে আপনার থ্রেড-নিরাপদ ভাগ করে নেওয়া মালিকানা শব্দার্থবিজ্ঞানের প্রয়োজন নেই, যা এটি সরবরাহ করে।
আর মার্টিনহো ফার্নান্দেস

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

2

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

লোকেরা স্মার্ট পয়েন্টার ছাড়াই সমস্ত ধরণের মেমরি পরিচালনার প্রয়োজনীয়তা এবং সমাধান পেতে পারে। আমি নিজেই মেমরি পরিচালনা করতে চাই, আমি কোনও মেমরি পুলের জিনিসগুলির জন্য জায়গা বরাদ্দ করতে পারি তাই এটি আগেভাগে বরাদ্দ করা হয় এবং রানটাইমের সময় নয় (গেমসের জন্য দরকারী)। আমি হয়ত সি ++ এর একটি আবর্জনা সংগ্রহ করা প্রয়োগ ব্যবহার করছি (সি ++ 11 এখনও এটি উপস্থিত থাকলেও এটি সম্ভব করে তোলে)। বা সম্ভবত আমি তাদের সাথে বিরক্ত করার বিষয়ে চিন্তা করার জন্য যথেষ্ট উন্নত কিছু করছি না, আমি জানতে পারি যে আমি নির্বিঘ্নিত বস্তুগুলিতে ভুলে যাব না ইত্যাদি। পয়েন্টার ক্রাচ ছাড়া স্মৃতি পরিচালনা করার ক্ষমতা সম্পর্কে আমি কেবল আত্মবিশ্বাসী।

সি এর সাথে সংহতকরণও অন্য একটি বিষয়।

আর একটি বিষয় স্মার্ট পয়েন্টারগুলি এসটিএল এর অংশ। সি ++ এসটিএল ছাড়াই ব্যবহারযোগ্য হতে নকশাকৃত।


" আরেকটি বিষয় হ'ল স্মার্ট পয়েন্টারগুলি এসটিএল এর অংশ। " তারা তা নয়।
কৌতূহলী

0

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

আমি যদি একটি ফর্ম অ্যাপ্লিকেশন লিখতে চাই, আমি স্মার্ট পয়েন্টার ব্যবহার বিবেচনা করতে পারি; কিন্তু একবার মেমরি পরিচালনা দ্বিতীয় প্রকৃতির মেমরির উপর দানাদার নিয়ন্ত্রণ না থাকা শান্ত বিরক্তিকর হয়ে ওঠে।


3
"বুস্টের ওভারহেড" বলে কোনও জিনিস নেই।
কৌতূহলী

4
আমি শেয়ার_পিটিআর কখনই আমার গেম ইঞ্জিনকে কোনও উল্লেখযোগ্য ডিগ্রীতে কমিয়ে দেয়নি। তারা যদিও উত্পাদন এবং ডিবাগিং প্রক্রিয়াটি গতি বাড়িয়েছে। এছাড়াও, "উত্সাহের ওভারহেড" বলতে কী বোঝায়? Castালাই করার জন্য এটি বেশ বড় কম্বল।
ডারপফেস

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