এসটিডি :: শেয়ারড_পিটারের কোনও অ-পারমাণবিক সমতুল্য কি নেই? এবং <মেমোরি> তে কেন নেই?


90

এটি দুটি অংশের একটি প্রশ্ন, এর পারমাণবিকতা সম্পর্কে সমস্ত std::shared_ptr:

১. যতদূর আমি বলতে পারি, std::shared_ptrএটিই <memory>পারমাণবিক একমাত্র স্মার্ট পয়েন্টার । আমি ভাবছি যে কোনও অ-পারমাণবিক সংস্করণ std::shared_ptrউপলব্ধ আছে কিনা (আমি এতে কিছু দেখতে পাচ্ছি না <memory>, তাই আমি বুস্টের মতো, স্ট্যান্ডার্ডের বাইরেও পরামর্শের জন্য উন্মুক্ত আছি)। আমি জানি boost::shared_ptrপারমাণবিকও (যদি BOOST_SP_DISABLE_THREADSসংজ্ঞায়িত না হয়) তবে সম্ভবত অন্য কোন বিকল্প আছে? আমি এমন কিছু সন্ধান করছি যার মতো শব্দার্থকতা রয়েছে std::shared_ptrতবে পারমাণবিকতা ছাড়াই।

2. আমি বুঝতে পারছি কেন std::shared_ptrপারমাণবিক; এটা খুব সুন্দর। তবে এটি প্রতিটি পরিস্থিতির পক্ষে দুর্দান্ত নয়, এবং সি ++ এর ইতিহাস icallyতিহাসিকভাবে "আপনি যা ব্যবহার করেন তার জন্য কেবল অর্থ প্রদান করুন" মন্ত্রটি রয়েছে had যদি আমি একাধিক থ্রেড ব্যবহার না করে থাকি বা যদি আমি একাধিক থ্রেড ব্যবহার করছি তবে থ্রেডগুলিতে পয়েন্টার মালিকানা ভাগ না করছি তবে একটি পারমাণবিক স্মার্ট পয়েন্টার ওভারকিল। আমার দ্বিতীয় প্রশ্নটি হ'ল কেন std::shared_ptrসি ++ 11 -তে একটি অ-পরমাণু সংস্করণ সরবরাহ করা হয়নি ? (সেখানে অভিমানী একটি হল কেন (যদি উত্তর কেবল হল "একটি অ-পারমাণবিক সংস্করণ কেবল কখনোই হিসেবে বিবেচনা করা হয়" বা "কেউ কি কখনও একটি অ পারমাণবিক সংস্করণের জন্য জিজ্ঞাসা করলেন," সেটা ঠিক আছে!))।

প্রশ্ন # 2 দিয়ে, আমি ভাবছি যে কেউ যদি কখনও কোনও অণু সংস্করণ প্রস্তাব করেন shared_ptr(হয় বুস্ট বা মানক কমিটির কাছে) (এর পারমাণবিক সংস্করণ প্রতিস্থাপন করার জন্য নয় shared_ptr, তবে এটির সাথে সহাবস্থান রাখতে) এবং এটি একটির জন্য নষ্ট হয়ে গেছে নির্দিষ্ট কারণ


4
আপনি এখানে "ব্যয়" ঠিক কী সম্পর্কে উদ্বিগ্ন? একটি পূর্ণসংখ্যার পারমাণবিকভাবে বাড়ানোর ব্যয়? আসলেই কি এমন কোনও ব্যয় যা কোনও বাস্তব প্রয়োগের জন্য আপনাকে চিন্তিত করে? বা আপনি কি অকালে অপ্টিমাইজ করছেন?
নিকল বোলাস

9
@ নিকোলবোলাস: এটি অন্য যে কোনও কিছুর চেয়ে বেশি কৌতূহল; আমার (বর্তমানে) এমন কোনও কোড / প্রকল্প নেই যেখানে আমি গুরুত্ব সহকারে অ-পরমাণু ভাগ করে নেওয়া পয়েন্টারটি ব্যবহার করতে চাই। তবে, আমি এমন প্রকল্পগুলি করেছি (অতীতে) যেখানে shared_ptrবোস্টের পারমাণবিকতার কারণে এটি একটি উল্লেখযোগ্য মন্দ ছিল এবং সংজ্ঞায়িত করার BOOST_DISABLE_THREADSফলে একটি উল্লেখযোগ্য পার্থক্য হয়েছিল (আমি জানি না std::shared_ptrযে একই ব্যয়টিও একই রকম হত boost::shared_ptrকিনা)।
কর্নস্টালক

13
@ ক্লোজার ভোটারগণ: প্রশ্নের কোন অংশটি গঠনমূলক নয়? দ্বিতীয় প্রশ্নের কেন নির্দিষ্ট কারণ না থাকলে , তা ঠিক আছে (একটি সাধারণ "এটি সহজভাবে বিবেচনা করা হয়নি" একটি বৈধ যথেষ্ট উত্তর হবে)। আমি উত্সাহী যদি সেখানে নির্দিষ্ট কারণ / যুক্তি উপস্থিত থাকে। এবং প্রথম প্রশ্নটি অবশ্যই একটি বৈধ প্রশ্ন, আমি বলব। আমার যদি প্রশ্নটি স্পষ্ট করতে বা এটিতে কিছুটা সামঞ্জস্য করার প্রয়োজন হয় তবে দয়া করে আমাকে জানান। তবে আমি দেখতে পাচ্ছি না এটি কীভাবে গঠনমূলক নয়।
কর্নস্টালক

10
@ কর্নস্টালक्स ভাল, সম্ভবত এটি সম্ভবত যে প্রশ্নগুলি যে "বৈকালিক অপ্টিমাইজেশন" হিসাবে সহজেই খারিজ করতে পারে, সে সম্পর্কে তারা প্রতিক্রিয়া জানায় না, প্রশ্নটি যতই বৈধ, সু-পোজযুক্ত বা প্রাসঙ্গিক হোক না কেন, আমার ধারণা। আমি নিজের পক্ষে একে গঠনমূলক হিসাবে বন্ধ করার কোনও কারণ দেখতে পাচ্ছি না।
খ্রিস্টান রাউ

13
(এখনই উত্তরটি লিখতে পারেন এটি বন্ধ, তাই মন্তব্য করা) আপনার প্রোগ্রাম যখন একাধিক থ্রেড shared_ptrব্যবহার করে না তখন পুনরায় গণনার জন্য পারমাণবিক অপ্স ব্যবহার করে না। Gcc.gnu.org/ML/libstdc++/2007-10/msg00180.html তে পিসি জন্য অণবিক প্রয়োগ এমনকি মাল্টিথ্রেড অ্যাপ্লিকেশনগুলিতে ব্যবহার করার অনুমতি দেওয়ার জন্য, এমন shared_ptrবস্তুগুলির জন্য যা ভাগ করে নেই for থ্রেড আমি বছরের পর বছর ধরে এই প্যাচটিতে বসে আছি তবে অবশেষে আমি এটি জিসিসির জন্য প্রতিশ্রুতি দেওয়ার কথা ভাবছি ৪.৯
জোনাথন ওয়াকলি

উত্তর:


107

১. আমি ভাবছি যে এখানে স্ট্যান্ড :: শেয়ারড_পিটারের কোনও অণু সংস্করণ উপলব্ধ কিনা

মান দ্বারা সরবরাহ করা হয় না। একটি "তৃতীয় পক্ষ" লাইব্রেরি দ্বারা সরবরাহ করা ভাল থাকতে পারে। প্রকৃতপক্ষে, সি ++ 11 এর আগে এবং বুস্টের আগে, দেখে মনে হয়েছিল যে প্রত্যেকে তাদের নিজস্ব রেফারেন্স গণনা করে স্মার্ট পয়েন্টার (আমার সহ) লিখেছেন।

২. আমার দ্বিতীয় প্রশ্নটি কেন সি ++ 11 এ স্টাড :: শেয়ারড_পিটারের একটি অ-পরমাণু সংস্করণ সরবরাহ করা হয়নি?

২০১০ সালে রাপার্সওয়িল সভায় এই প্রশ্নটি নিয়ে আলোচনা করা হয়েছিল। সুইজারল্যান্ড কর্তৃক এই জাতীয় জাতীয় সংস্থা # ২০ দ্বারা প্রবর্তন করা হয়েছিল। আপনার প্রশ্নে আপনি যে সরবরাহ করেছেন সেগুলি সহ বিতর্ক উভয় পক্ষেই শক্তিশালী যুক্তি ছিল ments যাইহোক, আলোচনা শেষে, ভোটের একটি অবিস্মরণবিহীন (অ-পারমাণবিক) সংস্করণ যুক্ত করার বিরুদ্ধে অত্যুক্তি (তবে সর্বসম্মত নয়) ছিল shared_ptr

অন্তর্ভুক্ত বিরুদ্ধে যুক্তি:

  • সিঙ্ক-অযুক্তিযুক্ত শেয়ারড_পিটারের সাথে লিখিত কোডটি রাস্তার নিচে থ্রেডযুক্ত কোডে ব্যবহৃত হতে পারে এবং শেষ পর্যন্ত কোনও সতর্কতা না দিয়ে সমস্যাগুলি ডিবাগ করাতে সমস্যা সৃষ্টি করে।

  • রেফারেন্স গণনাতে ট্র্যাফিকের "একতরফা" হ'ল একটি "সর্বজনীন" শেয়ার্ড_পিটার থাকার সুবিধা রয়েছে: মূল প্রস্তাবনা থেকে :

    তৃতীয় পক্ষের লাইব্রেরি সহ গ্রন্থাগারগুলির মধ্যে আন্তঃব্যবহারযোগ্যতার সুবিধার্থে ব্যবহৃত বৈশিষ্ট্যগুলি নির্বিশেষে একই অবজেক্টের ধরণ রয়েছে।

  • পরমাণুগুলির ব্যয়, শূন্য না হলেও অতিরিক্ত নয়। মুভ কনস্ট্রাকশন এবং মুভ অ্যাসাইনমেন্ট ব্যবহার করে ব্যয় হ্রাস করা হয় যা পারমাণবিক ক্রিয়াকলাপগুলি ব্যবহার করার প্রয়োজন হয় না। এই ধরনের অপারেশনগুলি vector<shared_ptr<T>>মুছতে এবং সন্নিবেশ করানোর ক্ষেত্রে সাধারণত ব্যবহৃত হয় ।

  • লোকেরা তাদের অ-পারমাণবিক রেফারেন্স-গণনা করা স্মার্ট পয়েন্টার লিখতে বাধা দেয় না যদি সত্যই তারা যা করতে চায়।

সেদিন র‌্যাপারসভিলে এলডাব্লুজি থেকে চূড়ান্ত শব্দটি ছিল:

সিএইচ 20 টি প্রত্যাখ্যান করুন a


7
বাহ, নিখুঁত, তথ্যের জন্য ধন্যবাদ! ঠিক সেই ধরণের তথ্যই আমি খুঁজে পেতে আশা করছিলাম।
কর্নস্টালক

> Has the same object type regardless of features used, greatly facilitating interoperability between libraries, including third-party libraries. এটি একটি চরম অদ্ভুত যুক্তি। তৃতীয় পক্ষের গ্রন্থাগারগুলি যে কোনও উপায়ে তাদের নিজস্ব প্রকার সরবরাহ করবে, সুতরাং তারা যদি এটি স্টাড :: শেয়ারড_পিটার <কাস্টম টাইপ>, এসটিডি :: নন_টমিক_শ্রেড_সিপি <কাস্টম টাইপ> ইত্যাদির অধীনে সরবরাহ করে তবে তা বিবেচনা করবে কেন? লাইব্রেরি যেভাবেই ফিরে আসে তার জন্য আপনাকে সর্বদা আপনার কোডটি মানিয়ে নিতে হবে
জিন-মাইকেল স্যালারিয়ার

লাইব্রেরি-নির্দিষ্ট ধরণের হিসাবে এটি সত্য, তবে ধারণাটি এমন যে প্রচুর জায়গা রয়েছে যেখানে তৃতীয় পক্ষের এপিআইতে স্ট্যান্ডার্ড প্রকারগুলি প্রদর্শিত হয়। উদাহরণস্বরূপ, আমার গ্রন্থাগারটি std::shared_ptr<std::string>কিছুটা সময় নিতে পারে । যদি অন্য কারও পাঠাগারটিও এ জাতীয় ধরণ গ্রহণ করে, কলকারীরা বিভিন্ন উপস্থাপনার মধ্যে রূপান্তরিত হওয়ার অসুবিধা বা ওভারহেড ছাড়াই আমাদের উভয়কে একই স্ট্রিংগুলি দিতে পারেন, এবং এটি প্রত্যেকের পক্ষে একটি ছোট জয়।
জ্যাক ও'কনর

52

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

যদিও আমি কমিটির সিদ্ধান্তের সাথে পুরোপুরি একমত, আমার মনে হয় বিশেষ বিশেষ ক্ষেত্রে একটি অলঙ্করণযুক্ত-জাতীয় shared_ptrধরণের ব্যবহারের কিছু উপকার আছে বলে আমি মনে করি , তাই আমি বিষয়টি কয়েকবার অনুসন্ধান করেছি।

যদি আমি একাধিক থ্রেড ব্যবহার না করে থাকি বা যদি আমি একাধিক থ্রেড ব্যবহার করছি তবে থ্রেডগুলিতে পয়েন্টার মালিকানা ভাগ না করছি তবে একটি পারমাণবিক স্মার্ট পয়েন্টার ওভারকিল।

জিসিসির সাথে যখন আপনার প্রোগ্রামটি একাধিক থ্রেড ব্যবহার করে না তখন শেয়ার্ড_পিটার পুনরায় গণনার জন্য পারমাণবিক অপ্স ব্যবহার করে না। এটি মোড়ক ফাংশনগুলির মাধ্যমে রেফারেন্স গণনাগুলি আপডেট করে যা প্রোগ্রামটি মাল্টিথ্রেডেড কিনা তা সনাক্ত করে (জিএনইউ / লিনাক্সে এই প্রোগ্রামটি লিঙ্কযুক্ত কিনা তা সন্ধান করেই করা হয়েছে libpthread.so) এবং সেই অনুযায়ী পারমাণবিক বা অ-পারমাণবিক ক্রিয়াকলাপে প্রেরণ করা।

আমি বহু বছর আগে বুঝতে পেরেছিলাম যে জিসিসি বেস ক্লাসেরshared_ptr<T> ক্ষেত্রে প্রয়োগ করা হয়েছে , স্পষ্টভাবে ব্যবহার করে মাল্টিথ্রেড কোডে এমনকি সিঙ্গল-থ্রেডড লকিং নীতি সহ বেস ক্লাস ব্যবহার করা সম্ভব । দুর্ভাগ্যক্রমে কারণ এটি জিসিসি ৪.৯-এর আগে এটি সর্বোত্তমভাবে কার্যকর হয়নি এবং কিছু অপারেশন এখনও মোড়ক ফাংশন ব্যবহার করে এবং তাই আপনি নীতিটি স্পষ্টভাবে অনুরোধ করলেও পারমাণবিক ক্রিয়াকলাপে প্রেরণ করেছেন Unfortunately (2) পয়েন্টটি দেখুন http://gcc.gnu.org/ml/libstdc++/2007-10/msg00180.html__shared_ptr<T, _LockPolicy>__shared_ptr<T, __gnu_cxx::_S_single>_S_singleআরও বিশদ এবং জিসিসিতে একটি প্যাচ অ-পারমাণবিক বাস্তবায়ন এমনকি মাল্টিথ্রেডেড অ্যাপ্লিকেশনগুলিতে ব্যবহার করার অনুমতি দেওয়ার জন্য। আমি বছরের পর বছর ধরে এই প্যাচটিতে বসেছিলাম তবে শেষ পর্যন্ত আমি এটি জিসিসি ৪.৯-এর জন্য প্রতিশ্রুতিবদ্ধ করেছি, যা আপনাকে থ্রেড-নিরাপদ নয় এমন একটি ভাগ করে নেওয়া পয়েন্টার টাইপ সংজ্ঞায়িত করতে এর মতো একটি উলাম টেম্পলেট ব্যবহার করতে দেয়:

template<typename T>
  using shared_ptr_unsynchronized = std::__shared_ptr<T, __gnu_cxx::_S_single>;

এই ধরণের সাথে আন্তঃযোগযোগ্য হবে না std::shared_ptr<T>এবং কেবল তখনই ব্যবহার করা নিরাপদ হবে যখন এটির গ্যারান্টি দেওয়া হয় যে shared_ptr_unsynchronizedঅতিরিক্ত ব্যবহারকারীর দ্বারা সরবরাহিত সিঙ্ক্রোনাইজেশন ছাড়া বস্তুগুলি কখনও থ্রেডের মধ্যে ভাগ করা যায় না।

এটি অবশ্যই পুরোপুরি অ-বহনযোগ্য, তবে কখনও কখনও এটি ঠিক আছে। ডান প্রিপ্রোসেসর হ্যাকের সাহায্যে আপনার কোডটি এখনও অন্য প্রয়োগকারীর সাথে সূক্ষ্মভাবে কাজ করবে যদি shared_ptr_unsynchronized<T>তার কোনও নাম হয় shared_ptr<T>তবে এটি জিসিসির সাথে কিছুটা দ্রুত হবে।


আপনি যদি ৪.৯-এর পূর্বে একটি জিসিসি ব্যবহার করেন তবে আপনি _Sp_counted_base<_S_single>নিজের কোডে স্পষ্ট বিশেষায়িতকরণ যুক্ত করে (এবং __shared_ptr<T, _S_single>ওডিআর লঙ্ঘন এড়াতে বিশেষায়িতকরণগুলি ব্যতীত কোনও ব্যক্তি পুনরায় ইনস্ট্যান্টেট নিশ্চিত করার মাধ্যমে এটি ব্যবহার করতে পারেন stdtypes ) এই জাতীয় প্রকারের বিশেষত যুক্তকরণ প্রযুক্তিগতভাবে অপরিজ্ঞাত, তবে অনুশীলনে কাজ করুন, কারণ এই ক্ষেত্রে আমার জিসিসিতে বিশেষীকরণ যুক্ত করার বা আপনার নিজের কোডে এগুলি যুক্ত করার মধ্যে কোনও পার্থক্য নেই।


4
শুধু ভাবছি, টেমপ্লেট ওরফে আপনার উদাহরণে টাইপো আছে? অর্থাত আমি মনে করি এটি ভাগ করা_সত্তা_সংশ্লিষ্ট = স্টাড :: __ শেয়ার্ড_পিটার <পড়তে হবে। ঘটনাক্রমে, আমি আজ এটি পরীক্ষা করেছি, std :: __ সক্ষম_শ্রেড_ফর্ম_এটি এবং std :: __ দুর্বল_পিটারের সাথে একত্রে, এবং এটি দুর্দান্তভাবে কাজ করছে বলে মনে হয় (gcc 4.9 এবং gcc 5.2)। সত্যই পারমাণবিক ক্রিয়াকলাপ বাদ পড়েছে কিনা তা দেখার জন্য আমি শীঘ্রই এটি প্রোফাইল / বিচ্ছিন্ন করব।
কার্ল কুক

অসাধারণ বিবরণ! সম্প্রতি আমি একটি বিষয়, বর্ণনা অনুযায়ী মুখোমুখি এই প্রশ্নের , যে অবশেষে আমার সোর্স কোড দেখব করা std::shared_ptr, std::__shared_ptr, __default_lock_policyএবং এই ধরনের। এই উত্তরটি কোড থেকে আমি কী বুঝতে পেরেছি তা নিশ্চিত করেছে।
নওয়াজ

21

আমার দ্বিতীয় প্রশ্নটি হ'ল কেন সি ++ 11 তে স্ট্যান্ডার্ড: শেয়ার্ড_পিটারের কোনও অণু সংস্করণ সরবরাহ করা হয়নি? (ধরে নিচ্ছি একটি কারণ আছে)।

কেউ কেবল সহজেই জিজ্ঞাসা করতে পারে কেন কেন কোনও অনুপ্রবেশকারী পয়েন্টার নেই, বা ভাগ্যবান পয়েন্টারগুলির যে কোনও অন্যান্য সম্ভাব্য প্রকরণের হতে পারে number

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

থ্রেডিং কেবল ভবিষ্যতে আরও প্রচলিত হতে চলেছে। প্রকৃতপক্ষে, সময় পার হওয়ার সাথে সাথে থ্রেডিং কার্য সম্পাদন করার অন্যতম প্রধান মাধ্যম হবে। থ্রেডিং সমর্থন করার জন্য প্রয়োজনীয় ন্যূনতম নূন্যতম করতে বেসিক স্মার্ট পয়েন্টারটির প্রয়োজন এই বাস্তবতাটিকে সহজতর করে।

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

বুস্ট করুন এবং এক্সটেনশনের মাধ্যমে কমিটি ব্যবহারের জন্য একটি নির্দিষ্ট স্মার্ট পয়েন্টার বেছে নিয়েছে। এটি বৈশিষ্ট্যগুলির একটি ভাল ভারসাম্য সরবরাহ করেছিল এবং এটি ব্যাপকভাবে এবং সাধারণত অনুশীলনে ব্যবহৃত হয়।

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

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


7
"1 এর জন্য" এগুলি এতদূর অনুলিপি না করাও কেউ বিবেচনা করতে পারে। "
আলী

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

স্পষ্টতার জন্য, আমি মনে করি আপনার উত্তরের শীর্ষে থাকা উক্তিটি পড়তে হবে "কেন সি ++ 11 তে স্ট্যান্ডার্ড: শেয়ার্ড_পিটারের একটি অ-পারমাণবিক সংস্করণ সরবরাহ করা হয়নি?"
চার্লস

4

আমি কাজের সময় ভাগ করা_প্টরে একটি আলোচনা প্রস্তুত করছি। আমি পৃথক malloc এড়ানোর জন্য একটি পরিবর্তিত বুস্ট শেয়ার্ড_পিটার ব্যবহার করছি (যেমন_ make_shared কী করতে পারে) এবং উপরে উল্লিখিত শেয়ারড_পিটার_সনক্রোনাইজের মতো লক পলিসির জন্য একটি টেম্পলেট প্যারাম। আমি প্রোগ্রামটি ব্যবহার করছি

http://flyingfrogblog.blogspot.hk/2011/01/boosts-sharedptr-up-to-10-slower-than.html

পরীক্ষা হিসাবে, অপ্রয়োজনীয় শেয়ারড_পিটার অনুলিপিগুলি পরিষ্কার করার পরে। প্রোগ্রামটি শুধুমাত্র মূল থ্রেড ব্যবহার করে এবং পরীক্ষার যুক্তি দেখানো হয়। পরীক্ষা এনএভিভি হ'ল লিনাক্সমিন্ট ১৪ চলমান একটি নোটবুক।

Make_shared পরিবর্তিত বুস্ট সহ পরীক্ষা রান সেটআপ বুস্ট (1.49) স্ট্যান্ড করুন
এমটি-অনিরাপদ (11) 11.9 9 / 11.5 (-পথ প্রসারিত) 8.4  
পারমাণবিক (11) 13.6 12.4 13.0  
এমটি-অনিরাপদ (12) 113.5 85.8 / 108.9 (প্রসারিত অন) 81.5  
পারমাণবিক (12) 126.0 109.1 123.6  

কেবলমাত্র 'std' সংস্করণটি -std = cxx11 ব্যবহার করে, এবং -পথটি সম্ভবত লক_পুলিকে জি ++ __শ্রেড_পিটার শ্রেণিতে স্যুইচ করে।

এই সংখ্যাগুলি থেকে, আমি কোড অপ্টিমাইজেশনে পারমাণবিক নির্দেশাবলীর প্রভাব দেখতে পাচ্ছি। পরীক্ষার কেসটি কোনও সি ++ পাত্রে ব্যবহার করে না, তবে vector<shared_ptr<some_small_POD>>যদি বস্তুটির থ্রেড সুরক্ষার প্রয়োজন না হয় তবে ক্ষতিগ্রস্থ হতে পারে। বুস্ট কম ক্ষতিগ্রস্থ হয় কারণ অতিরিক্ত মালক ইনলাইনিং এবং কোড অপটিমাইজনের পরিমাণ সীমিত করে চলেছে।

পারমাণবিক নির্দেশাবলীর স্কেল্যাবিলিটি পরীক্ষা করার জন্য আমার কাছে পর্যাপ্ত কোর সহ একটি মেশিন এখনও খুঁজে পাওয়া যায় নি, তবে std :: শেয়ার_ptr কেবল তখনই ব্যবহার করা সম্ভব সম্ভবত ভাল better


4

বুস্ট একটি shared_ptrঅ-পরমাণু সরবরাহ করে। এটি বলা হয় local_shared_ptr, এবং বুস্টের স্মার্ট পয়েন্টার লাইব্রেরিতে পাওয়া যায়।


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

@ রেড.ওয়েভ আপনি কি বোঝাতে পারবেন যে আপনি ইন্ডিয়ারেশন দিয়ে কী বোঝাতে চেয়েছেন এবং এটি কীভাবে পারফরম্যান্সকে প্রভাবিত করে? আপনি কী বোঝাতে চাইছেন যে এটি shared_ptrস্থানীয়ভাবে সত্ত্বেও কাউন্টারটির সাথে রয়েছে? অথবা আপনি বোঝাতে চাইছেন যে এটির সাথে আরও একটি সমস্যা আছে? ডক্স বলছে যে একমাত্র পার্থক্য এটি পারমাণবিক নয়।
কোয়ান্টাম পদার্থবিজ্ঞানী

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

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

4
@ রেড.ভ্যাভ যদি আপনি আসল উত্স কোডটি github.com/boostorg/smart_ptr/blob/… তাকান তবে আপনি দেখতে পাবেন যে কোনও ডাবল ইন্ডিয়ারেশন নেই। ডকুমেন্টেশনের এই অনুচ্ছেদটি কেবল একটি মানসিক মডেল।
ইলিয়া পোপভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.