আমাদের কি রেফারেন্স বা মান দ্বারা একটি শেয়ার্ড_পিটার পাস করা উচিত?


269

যখন কোনও ফাংশন একটি নেয় shared_ptr(বুস্ট বা সি ++ 11 এসটিএল থেকে), আপনি কি এটি পাস করছেন:

  • কনডেন্ট রেফারেন্স দ্বারা: void foo(const shared_ptr<T>& p)

  • বা মূল্য দ্বারা: void foo(shared_ptr<T> p)?

আমি প্রথম পদ্ধতিটি পছন্দ করব কারণ আমার সন্দেহ হয় এটি আরও দ্রুত হবে। তবে আসলেই কি এটি মূল্যবান বা কোনও অতিরিক্ত সমস্যা আছে?

আপনি দয়া করে আপনার পছন্দের কারণগুলি দিতে পারেন বা যদি কেস হয় তবে আপনি কেন এটি বিবেচনা করবেন না তা বিবেচনা করুন।


14
সমস্যাগুলি সেগুলির সমতুল্য নয়। রেফারেন্স সংস্করণটি চিৎকার করে তোলে "আমি কিছু shared_ptrলোকের নাম রাখছি , এবং আমি চাইলে এটি পরিবর্তন করতে পারি" ", যখন মান সংস্করণটি বলে" আমি আপনার অনুলিপি করতে যাচ্ছি shared_ptr, আমি যখন এটি পরিবর্তন করতে পারি তখন আপনি কখনই জানতে পারবেন না। ) কনস্ট-রেফারেন্স প্যারামিটার হ'ল আসল সমাধান, যা বলে যে "আমি কিছু লোকের নাম রাখছি shared_ptr, এবং আমি এটি পরিবর্তন করব না বলে প্রতিশ্রুতি দিয়েছি।" (যা বাই-ভ্যালু শব্দার্থের সাথে অত্যন্ত মিল)!
GManNGG

2
আরে আমি কোনও শ্রেণীর সদস্যকে ফিরিয়ে দেওয়ার বিষয়ে আপনার লোকদের মতামত সম্পর্কে আগ্রহী shared_ptr। আপনি কি কনস্ট-রেফ দ্বারা এটি করেন?
জোহানেস স্কাউব -

তৃতীয় সম্ভাবনাটি হ'ল স্ট্যান্ড :: মুভ () সি ++ 0 এক্স এর সাথে ব্যবহার করা, এটি উভয়কে ভাগ করে দেওয়া_আপনার
টমাকা 17

@ জোহানেস: কোনও অনুলিপি / রেফ-গণনা এড়াতে আমি কনস্ট্যান্ড-রেফারেন্স দিয়ে এটি ফিরিয়ে দেব। তারপরে আবার আমি সমস্ত সদস্যকে আদিম না হলে কনস্ট্যান্ড-রেফারেন্স দিয়ে ফিরিয়ে দিই।
GManNickG

উত্তর:


228

এই প্রশ্নটি স্কট, আন্ড্রেই এবং হার্ব সি সি ++ এবং এর বাইরে ২০১১- তে জিজ্ঞাসা যেকোন কিছু সেশনের সময় আলোচনা করেছেন এবং এর উত্তর দিয়েছেন । কর্মক্ষমতা এবং নির্ভুলতার উপর 4:34 থেকে দেখুন ।shared_ptr

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

উপরের লিঙ্কযুক্ত টক ভিডিওতে স্কট মেয়ার্সের ব্যাখ্যা অনুসারে আপনি এটিকে চলা-অপ্টিমাইজ করতে না পারলে, তবে এটি আপনি ব্যবহার করতে পারেন এমন সি ++ এর আসল সংস্করণের সাথে সম্পর্কিত।

GoingNative 2012 সম্মেলনের ইন্টারেক্টিভ প্যানেল চলাকালীন এই আলোচনার একটি বড় আপডেট ঘটেছে : আমাদের কিছু জিজ্ঞাসা করুন! যা দেখার মতো, বিশেষ করে 22:50 থেকে ।


5
কিন্তু এখানে দেখানো এটা মান পাস সস্তা: stackoverflow.com/a/12002668/128384 না যে একাউন্টে পাশাপাশি (অন্তত কনস্ট্রাকটর আর্গুমেন্ট ইত্যাদি যেখানে একটি shared_ptr সদস্য তৈরি করা যাচ্ছে গ্রহণ করা উচিত শ্রেণী)?
আট

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

1
" মাল্টি-থ্রেডিং না থাকলে " না, এমটি কোনওভাবেই বিশেষ নয়।
কৌতূহলী

3
আমি পার্টিতে বেশ দেরি করছি, তবে শেয়ারড_পিটারকে মূল্য দিয়ে পাস করার জন্য আমার কারণ হ'ল কোডটি সংক্ষিপ্ত এবং সুন্দর করে তোলে। সিরিয়াসলি। Value*সংক্ষিপ্ত এবং পাঠযোগ্য, তবে এটি খারাপ, এখন আমার কোডটি পূর্ণ const shared_ptr<Value>&এবং এটি উল্লেখযোগ্যভাবে কম পঠনযোগ্য এবং ঠিক ... কম পরিপাটি। আগে void Function(Value* v1, Value* v2, Value* v3)এখন কী ছিল void Function(const shared_ptr<Value>& v1, const shared_ptr<Value>& v2, const shared_ptr<Value>& v3), এবং লোকেরা এর সাথে কি ঠিক আছে?
অ্যালেক্স

7
@ অ্যালেক্স কমন অনুশীলন ক্লাসের ঠিক পরে এলিয়াস (টাইপিডেফ) তৈরি করছে। উদাহরণস্বরূপ: class Value {...}; using ValuePtr = std::shared_ptr<Value>;আপনার ফাংশনটি আরও সহজ হয়ে যায়: void Function(const ValuePtr& v1, const ValuePtr& v2, const ValuePtr& v3)এবং আপনি সর্বাধিক কর্মক্ষমতা পান। আপনি সি ++ ব্যবহার করেন তাই না? :)
4LegsDrivenCat

91

এখানে ভেষজ সুটার গ্রহণ করুন

গাইডলাইন: আপনি স্মার্ট পয়েন্টার নিজেই ভাগ করতে বা মালিকানা হস্তান্তর করতে না চাইলে কোনও ফাংশন প্যারামিটার হিসাবে স্মার্ট পয়েন্টারটি পাস করবেন না।

গাইডলাইন: এক্সপ্রেস করুন যে কোনও ফাংশন একটি হ'ল অবজেক্টের বাই-ভ্যালু শেয়ারড_পিটার প্যারামিটার ব্যবহার করে মালিকানা ভাগ করে নেবে।

গাইডলাইন: কেবলমাত্র শেয়ারড_পিটারটি সংশোধন করতে একটি অবিচ্ছিন্ন শেয়ারড_পিটার এবং প্যারামিটার ব্যবহার করুন। কনস্টের শেয়ারড_পিটার এবং প্যারামিটার হিসাবে কেবল তখনই ব্যবহার করুন যদি আপনি অনুলিপি গ্রহণ করবেন না এবং তার মালিকানা ভাগ করবেন না; অন্যথায় পরিবর্তে উইজেট * ব্যবহার করুন (বা যদি না হয় তবে একটি উইজেট &)।


3
সুটার লিঙ্কের জন্য ধন্যবাদ। এটি একটি দুর্দান্ত নিবন্ধ। আমি সি ++ 14 উপলব্ধ থাকলে ifচ্ছিক <উইজেট &> পছন্দ করে উইজেট * এ তার সাথে একমত নই। উইজেট * পুরানো কোড থেকে খুব অস্পষ্ট।
এপিমনাম

3
উইজেট * এবং উইজেট এবং সম্ভাবনা হিসাবে অন্তর্ভুক্ত করার জন্য +1। কেবল বিশদভাবে বলতে গেলে, উইজেট * বা উইজেট পাস করা & ফাংশনটি যখন পয়েন্টার অবজেক্টটি নিজেই পরীক্ষা করে / পরিবর্তন করে না তখন সম্ভবত এটি সর্বোত্তম বিকল্প। ইন্টারফেসটি আরও সাধারণ, কারণ এটিতে নির্দিষ্ট পয়েন্টার ধরণের প্রয়োজন হয় না, এবং ভাগ করা_পিটি’র রেফারেন্স গণনাটির কার্য সম্পাদন ইস্যুটি ডজড হয়।
tgnottingham

4
আমি মনে করি এটি আজ গ্রহণযোগ্য উত্তর হওয়া উচিত, কারণ দ্বিতীয় গাইডলাইন। এটি স্পষ্টভাবে বর্তমান গৃহীত উত্তরকে অকার্যকর করে, যা বলে: মান দ্বারা পাস করার কোনও কারণ নেই।
এমবিআরটি

63

ব্যক্তিগতভাবে আমি একটি constরেফারেন্স ব্যবহার করব । কোনও ফাংশন কলের প্রয়োজনে এটি আবার হ্রাস করার জন্য রেফারেন্স গণনাটি বাড়ানোর দরকার নেই।


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

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

37

constরেফারেন্স দ্বারা পাস , এটি দ্রুত। আপনার যদি এটি সঞ্চয় করতে হয় তবে কিছু ধারক করে বলুন, রেফ। অনুলিপি অপারেশন দ্বারা গণনা স্বয়ং-যাদুতে বৃদ্ধি পাবে।


4
ডাউনভোট কোনও সংখ্যা ছাড়াই এর ব্যাক আপ নিতে তার মতামতটি বজায় রাখে।
kwesolowski

22

আমি একবার দিয়ে নিচের কোড দৌড়ে fooগ্রহণ shared_ptrদ্বারা const&এবং আবার সঙ্গে fooগ্রহণ shared_ptrমান দ্বারা।

void foo(const std::shared_ptr<int>& p)
{
    static int x = 0;
    *p = ++x;
}

int main()
{
    auto p = std::make_shared<int>();
    auto start = clock();
    for (int i = 0; i < 10000000; ++i)
    {
        foo(p);
    }    
    std::cout << "Took " << clock() - start << " ms" << std::endl;
}

আমার ইনটেল কোর 2 কোয়াড (2.4GHz) প্রসেসরে VS2015, x86 রিলিজ বিল্ড ব্যবহার করে

const shared_ptr&     - 10ms  
shared_ptr            - 281ms 

মান সংস্করণ অনুসারে অনুলিপিটি ধীরে ধীরে ধীরে ধীরে ক্রম ছিল।
আপনি যদি বর্তমান থ্রেড থেকে সিঙ্ক্রোনালি কোনও ফাংশন কল করে থাকেন তবে const&সংস্করণটি পছন্দ করুন ।


1
আপনি কী সংকলক, প্ল্যাটফর্ম এবং অপ্টিমাইজেশন সেটিংস ব্যবহার করেছেন তা বলতে পারেন?
কার্লটন

আমি vs2015 এর ডিবাগ বিল্ডটি ব্যবহার করেছি, এখনই বিল্ডটি প্রকাশের উত্তরটি আপডেট করেছি।
tcb

1
আমি আগ্রহী যদি অপ্টিমাইজেশন চালু হয়, আপনি উভয়ের সাথে একই ফলাফল পাবেন
এলিয়ট উডস

2
অপ্টিমাইজেশন খুব একটা সাহায্য করে না। সমস্যাটি হ'ল অনুলিপিটি অনুলিপিটির অনুলিপিটিতে।
অ্যালেক্স

1
ঐটা আসল কথা না. যেমন একটি foo()ফাংশন এমনকি প্রথম স্থানে একটি ভাগ পয়েন্টার গ্রহণ করা উচিত নয়, কারণ এটা এই বস্তুর ব্যবহার করছেন না আছে: এটি একটি গ্রহণ করা উচিত int&কি p = ++x;, কলিং foo(*p);থেকে main()। কোনও ফাংশন যখন এটির সাথে কিছু করার দরকার হয় তখন একটি স্মার্ট পয়েন্টার অবজেক্টটি গ্রহণ করে এবং বেশিরভাগ সময় আপনাকে যা করতে হবে তা এটি ( std::move()) অন্য কোথাও নিয়ে যাওয়া হয়, সুতরাং একটি বাই-ভ্যালু প্যারামিটারের কোনও মূল্য নেই।
eepp

14

যেহেতু সি ++ 11 আপনার এটিকে কনস্টের চেয়ে বেশি মূল্য হিসাবে নেওয়া উচিত এবং আপনি যা ভাবেন তার চেয়ে বেশি বার।

আপনি যদি std :: shared_ptr (অন্তর্নিহিত টাইপ টির পরিবর্তে) নিচ্ছেন তবে আপনি এটি করছেন কারণ আপনি এটির সাথে কিছু করতে চান।

আপনি যদি এটি কপি করতে চান অন্য কোথাও এটি অনুলিপি দ্বারা নেওয়া আরও বুদ্ধিমান এবং স্ট্যান্ড :: এটিকে কনস্টের মাধ্যমে না নিয়ে অভ্যন্তরীণভাবে সরানো এবং তারপরে এটি অনুলিপি করা উচিত। এটি কারণ আপনি কলারকে বিকল্প হিসাবে মঞ্জুরি দেবেন std :: আপনার ফাংশনটি কল করার সময় ভাগ করে নেওয়া_আপনার সরান, এইভাবে নিজেকে বৃদ্ধি এবং হ্রাস ক্রিয়াকলাপগুলির একটি সেট সংরক্ষণ করুন। অথবা না. এটি হ'ল, ফাংশনটির আহ্বায়ক ফাংশনটি কল করার পরে তার চারপাশে std :: shared_ptr দরকার কিনা এবং স্থানান্তরিত হবে কি না তা নির্ভর করবে decide যদি আপনি কনস্ট & এ পাস করেন তবে এটি অর্জনযোগ্য নয় এবং সুতরাং এটির পরে এটি মান দ্বারা নেওয়া ভাল।

অবশ্যই, যদি কলার উভয়ের পক্ষে তার শেয়ারড_পিটারের বেশি সময় প্রয়োজন হয় (সুতরাং এটি স্ট্যান্ড করতে পারে না :: এটি সরানো যায় না) এবং আপনি ফাংশনে একটি সরল অনুলিপি তৈরি করতে চান না (বলুন আপনি একটি দুর্বল পয়েন্টার চান, বা আপনি কেবল কখনও কখনও চান) কোনও শর্তের উপর নির্ভর করে এটি অনুলিপি করতে), তারপরে কোনও কনস্ট এবং তারপরে আরও ভাল।

উদাহরণস্বরূপ, আপনার করা উচিত

void enqueue(std::shared<T> t) m_internal_queue.enqueue(std::move(t));

উপর

void enqueue(std::shared<T> const& t) m_internal_queue.enqueue(t);

কারণ এই ক্ষেত্রে আপনি সর্বদা অভ্যন্তরীণভাবে একটি অনুলিপি তৈরি করেন


1

পারমাণবিক বৃদ্ধি এবং হ্রাস যেখানে ভাগ করা_কপি অনুলিপি অপারেশনের সময় ব্যয় না জেনে আমি অনেক বেশি সিপিইউ ব্যবহারের সমস্যায় ভুগছি। আমি কখনই পারমাণবিক বৃদ্ধি এবং হ্রাস এতো বেশি ব্যয় নিতে পারে বলে আশা করি না।

আমার পরীক্ষার ফলাফল অনুসরণ করে, অন্তর্গত 32 পারমাণবিক বৃদ্ধি এবং হ্রাস অ-পরমাণু বৃদ্ধি এবং হ্রাসের চেয়ে 2 বা 40 গুণ সময় নেয়। আমি এটি উইন্ডোজ 8.1 এর সাথে 3 জিএইচজেড কোর আই 7 এ পেয়েছি। পূর্বের ফলাফলটি প্রকাশিত হয় যখন কোনও বিতর্ক হয় না, যখন উচ্চ বিতর্ক হওয়ার সম্ভাবনা থাকে। আমি মনে রাখি যে পারমাণবিক অপারেশনগুলি সর্বশেষ হার্ডওয়্যার ভিত্তিক লক হয় at লক হ'ল লক। বিতর্ক দেখা দিলে কর্মক্ষমতা খারাপ হয়।

এটির অভিজ্ঞতা নিয়ে, আমি সর্বদা উপস্থাপক (শেয়ারড_পিটার) এর চেয়ে বাইরেফ (কনস্ট্রেটেড শেয়ার্ড_পিটার এবং) ব্যবহার করি।


0

সাম্প্রতিক একটি ব্লগ পোস্ট ছিল: https://medium.com/@vgasparyan1995/pass-by-value-vs-pass-by-references-to-const-c-f8944171e3ce

সুতরাং এর উত্তর হ'ল: (প্রায়) কখনই পাস করবেন না const shared_ptr<T>&
কেবল পরিবর্তে অন্তর্নিহিত শ্রেণিতে পাস করুন।

মূলত একমাত্র যুক্তিসঙ্গত প্যারামিটারের ধরনগুলি:

  • shared_ptr<T> - সংশোধন করুন এবং মালিকানা নিন
  • shared_ptr<const T> - সংশোধন করবেন না, মালিকানা নিন
  • T& - পরিবর্তন করুন, মালিকানা নেই
  • const T& - সংশোধন করবেন না, মালিকানা নেই
  • T - সংশোধন করবেন না, মালিকানা নেই, অনুলিপি করুন

যেমন @ অ্যাক্সেল https://stackoverflow.com/a/26197326/1930508 এ দেখিয়েছে হার্ব সটারের পরামর্শটি হ'ল:

কনস্টের শেয়ারড_পিটার এবং প্যারামিটার হিসাবে কেবল তখনই ব্যবহার করুন যা আপনি অনুলিপি এবং ভাগ করে নেবেন কিনা তা আপনি নিশ্চিত নন

তবে কতটি ক্ষেত্রে আপনি নিশ্চিত নন? সুতরাং এটি একটি বিরল পরিস্থিতি


0

এটি ज्ञात সমস্যা যে শেয়ারড_পিটারকে মান অনুসারে পাস করার একটি খরচ রয়েছে এবং সম্ভব হলে এড়ানো উচিত।

ভাগ করা_পিটিআর দ্বারা পাসের ব্যয়

বেশিরভাগ সময় রেফারেন্স দ্বারা ভাগ করা_পিটর পাস এবং কনস্ট্যান্ড রেফারেন্সের চেয়ে আরও ভাল, করানো হত।

সিপিপি কোর গাইডলাইনে শেয়ারড_পিটার পাস করার জন্য একটি নির্দিষ্ট নিয়ম রয়েছে

আর .৩৪: কোনও ফাংশন অংশের মালিক তা প্রকাশ করতে একটি শেয়ার্ড_পিটার প্যারামিটার নিন

void share(shared_ptr<widget>);            // share -- "will" retain refcount

যখন ভাগ করে নেওয়া_পিট্রিটি মান দ্বারা পাস করা যায় তার একটি উদাহরণ হ'ল কলার যখন একটি অ্যাসিঙ্ক্রোনাস ক্যালিতে একটি ভাগ করা বস্তুটি পাস করেন - যেমন কলি তার কাজ শেষ করার আগেই সুযোগের বাইরে চলে যায়। ক্যালিকে অবশ্যই ভাগ করে নেওয়া বস্তুর আজীবন "প্রসারিত" করতে হবে মান দ্বারা শেয়ার_পিটার গ্রহণ করে। এই ক্ষেত্রে, ভাগ করা_পিটিআরের একটি রেফারেন্স পাস করা হবে না।

কাজের থ্রেডে ভাগ করা অবজেক্টটি একইভাবে পাস করার জন্য হয়।


-4

শেয়ারড_পিটার পর্যাপ্ত পরিমাণে বড় নয়, না এর নির্মাতা \ ডিস্ট্রাক্টর সেখানে অনুলিপি সম্পাদনার পক্ষে রেফারেন্স বনাম পাস সম্পর্কে যত্ন নেওয়ার জন্য কপি থেকে পর্যাপ্ত ওভারহেড থাকার জন্য যথেষ্ট কাজ করেন।


15
আপনি এটি পরিমাপ করেছেন?
কৌতূহলী

2
@ স্টোনমেটাল: নতুন শেয়ার্ড_পিটার তৈরির সময় পারমাণবিক নির্দেশনা সম্পর্কে কী?
কারারা

এটি একটি নন-পিওডি টাইপ, সুতরাং বেশিরভাগ এবিআইতে এমনকি "মান অনুসারে" এটি পয়েন্টারটিও পাস করে passes এটি মোটেই সমস্যাটি বাইটের আসল অনুলিপি নয়। আপনি যেমন asm আউটপুটে দেখতে পাচ্ছেন, shared_ptr<int>মান অনুসারে পাস করতে 100 x86 টিরও বেশি নির্দেশাবলী লাগে ( lockরেফ গণনাটিকে পরমাণুভাবে inc / dec করার জন্য ব্যয়বহুল এড নির্দেশাবলী সহ )। ধ্রুবক রেফের মাধ্যমে পাস করা কোনও কিছুর কাছে পয়েন্টার পাস করার সমান (এবং গডবোল্ট সংকলক এক্সপ্লোরারের এই উদাহরণে, টেল-কল অপটিমাইজেশন এটিকে কলের পরিবর্তে একটি সাধারণ জ্যাম্পে রূপান্তরিত করে : Godbolt.org/g/TazMBU )।
পিটার কর্ডস

টিএল: ডিআর: এটি সি ++ যেখানে অনুলিপি-নির্মাতারা কেবল বাইটগুলি অনুলিপি করার চেয়ে অনেক বেশি কাজ করতে পারেন। এই উত্তরটি মোট আবর্জনা।
পিটার কর্ডস

2
stackoverflow.com/questions/3628081/ Shared- ptr-hororses-speed উদাহরণ হিসাবে ভাগ করে নেওয়া পয়েন্টারগুলি মান বনাম পাসের সাথে রেফারেন্স দিয়ে পাস করেছে সে প্রায় 33% রানের সময় পার্থক্য দেখে। আপনি যদি পারফরম্যান্স সমালোচনামূলক কোড নিয়ে কাজ করছেন তবে নগ্ন পয়েন্টারগুলি আপনাকে আরও বড় পারফরম্যান্স বৃদ্ধি করবে। কনস্ট রেফ দিয়ে নিশ্চিত হন যদি আপনি মনে রাখেন তবে এটি যদি আপনার না হয় তবে এটি কোনও বড় বিষয় নয়। আপনার যদি প্রয়োজন না হয় তবে শেয়ারড_পিটার ব্যবহার না করা আরও বেশি গুরুত্বপূর্ণ is
স্টোনমেটাল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.