সি ++: স্মার্ট পয়েন্টার, কাঁচা পয়েন্টার, কোনও পয়েন্টার নেই? [বন্ধ]


48

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

আপনি বিবেচনা করতে পারেন

  • অবজেক্টের মালিকানা
  • ব্যবহারে সহজ
  • নকল নীতি
  • মাথার উপরে
  • চক্রীয় রেফারেন্স
  • লক্ষ্য প্ল্যাটফর্ম
  • পাত্রে সঙ্গে ব্যবহার করুন

উত্তর:


32

বিভিন্ন পদ্ধতির চেষ্টা করার পরে, আজ আমি নিজেকে গুগল সি ++ স্টাইল গাইডের সাথে সারিবদ্ধ করে দেখছি :

আপনার যদি আসলে পয়েন্টার শব্দার্থক প্রয়োজন হয়, স্কোপড_পিটার দুর্দান্ত। আপনার কেবল স্ট্যান্ড :: ট্র 1 :: শেয়ারড_পিটার খুব নির্দিষ্ট অবস্থার অধীনে ব্যবহার করা উচিত, যেমন যখন এসটিএল কনটেইনার দ্বারা বস্তুগুলি রাখা প্রয়োজন। আপনার কখনই অটো_পিটার ব্যবহার করা উচিত নয়। [...]

সাধারণভাবে বলতে গেলে, আমরা পছন্দ করি যে আমরা পরিষ্কার আইনের মালিকানার সাথে কোড ডিজাইন করি। স্পষ্টভাবে অবজেক্টের মালিকানা কোনও পয়েন্টার ব্যবহার না করে সরাসরি কোনও ক্ষেত্র বা স্থানীয় ভেরিয়েবল হিসাবে ব্যবহার করে প্রাপ্ত হয়। [..]

যদিও তাদের সুপারিশ করা হয় না, রেফারেন্স গণনা পয়েন্টারগুলি কখনও কখনও কোনও সমস্যা সমাধানের সহজতম এবং সর্বাধিক মার্জিত উপায়।


14
আজ, আপনি স্কোপড_পিটারের পরিবর্তে স্টাডি :: ইউনিক_পিটার ব্যবহার করতে চাইতে পারেন।
ক্লাইম

24

আমি "শক্তিশালী মালিকানা" চিন্তার ট্রেনও অনুসরণ করি। আমি পরিষ্কারভাবে বর্ণনা করতে চাই যে উপযুক্ত হলে "এই শ্রেণিটি এই সদস্যটির মালিক"।

আমি খুব কমই ব্যবহার করি shared_ptr। যদি আমি এটি করি, আমি weak_ptrযখনই পারি তখন আমি উদার ব্যবহার করি তাই আমি রেফারেন্সের সংখ্যা বাড়ানোর পরিবর্তে অবজেক্টটির কাছে হ্যান্ডেলের মতো আচরণ করতে পারি।

আমি scoped_ptrপুরো জায়গা জুড়ে ব্যবহার । এটি সুস্পষ্ট মালিকানা দেখায়। আমি কেবল কোনও সদস্যের মতো বস্তুগুলি না তৈরি করার একমাত্র কারণ হ'ল আপনি যদি তাদের সামনে ঘোষণা করতে পারেন তবে যদি তারা কোনও স্কোপড_প্টারে থাকে।

আমার যদি জিনিসগুলির একটি তালিকা প্রয়োজন, আমি ব্যবহার করি ptr_vector। এটি আরও দক্ষ এবং ব্যবহারের চেয়ে কম পার্শ্ব প্রতিক্রিয়া রয়েছে vector<shared_ptr>। আমি মনে করি আপনি ptr_vector এ টাইপ ঘোষণা করতে সক্ষম হতে পারবেন না (এটি কিছুক্ষণ হয়ে গেছে) তবে এর শব্দার্থবিজ্ঞানগুলি এটি আমার মতে এটির পক্ষে মূল্যবান করে তুলেছে। মূলত আপনি যদি তালিকা থেকে কোনও বস্তু সরিয়ে থাকেন তবে এটি স্বয়ংক্রিয়ভাবে মুছে ফেলা হবে। এটি সুস্পষ্ট মালিকানাও দেখায়।

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

এই পদ্ধতির সাহায্যে, আমি যে আইফোন গেমটিতে কাজ করেছি সেটিতে কেবল একটি একক deleteকল আসতে পেরেছিল এবং সেটি ওবজ-সি থেকে সি ++ সেতুতে ছিল wrote

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


1
দুর্দান্ত সংক্ষিপ্তসার। আপনি কি আসলে স্মার্ট_পিটারের উল্লেখের বিপরীতে শেয়ারড_পিটার বলতে চান?
jmp97

হ্যাঁ, আমি শেয়ারড_পিটার বোঝাতে চাইছি। আমি এটা ঠিক করব।
টেট্রাড

10

কাজের জন্য সঠিক টুল ব্যবহার করুন।

যদি আপনার প্রোগ্রাম ব্যতিক্রমগুলি ছুঁড়ে ফেলতে পারে তা নিশ্চিত করুন যে আপনার কোডটি ব্যতিক্রম সচেতন। স্মার্ট পয়েন্টার, আরএআইআই এবং 2 পর্বের নির্মাণ এড়ানো ভাল স্টার্ট পয়েন্ট।

আপনার যদি কোনও স্পষ্ট মালিকানা শব্দার্থবিজ্ঞানের সাথে চক্রীয় রেফারেন্স থাকে তবে আপনি কোনও আবর্জনা সংগ্রহের পাঠাগারটি ব্যবহার করতে বা আপনার নকশাকে পুনরায় সাজানোর বিষয়টি বিবেচনা করতে পারেন।

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

আপনি যদি একাধিক-থ্রেড পরিবেশে কাজ করছেন তবে নিশ্চিত হয়ে নিন যে আপনার জিনিসটি সম্ভাব্যভাবে থ্রেডে ভাগ করা হয়েছে কিনা। বুস্ট :: শেয়ারড_পিটিআর বা এসটিডি :: ট্র 1 :: শেয়ারড_পিটার ব্যবহার বিবেচনা করার অন্যতম প্রধান কারণ হ'ল এটি থ্রেড-নিরাপদ রেফারেন্স গণনা ব্যবহার করে।

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

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

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

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

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

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


3
কনসোলগুলিতে ব্যতিক্রম হ্যান্ডলিংটি কিছুটা ঝাঁকুনির হতে পারে - বিশেষত এক্সডিকে এক ধরণের ব্যতিক্রম-প্রতিকূল।
ক্র্যাশ ওয়ার্কস

1
লক্ষ্য প্ল্যাটফর্মের সত্যই আপনার নকশাকে প্রভাবিত করা উচিত। আপনার ডেটা ট্রান্সফর্ম করে এমন হার্ডওয়্যারটির মাঝে মাঝে আপনার সোর্স-কোডে বড় প্রভাব থাকতে পারে। পিএস 3-আর্কিটেকচার একটি কংক্রিটের উদাহরণ যেখানে আপনার রিসোর্স এবং মেমরি-পরিচালনা পাশাপাশি আপনার রেন্ডারারের নকশা করার ক্ষেত্রে আপনাকে হার্ডওয়ারটি নেওয়া দরকার।
সাইমন

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

4

আপনি যদি C ++ 0x ব্যবহার করেন তবে ব্যবহার করুন std::unique_ptr<T>

এটির ওভারহেডের কোনও পারফরম্যান্স নেই, std::shared_ptr<T>যার থেকে রেফারেন্স গণনা ওভারহেড রয়েছে unlike একটি অনন্য_পিটার এর পয়েন্টারটির মালিক , এবং আপনি সি ++ 0 এক্সের পদক্ষেপের শব্দার্থক পদার্থের সাথে মালিকানা স্থানান্তর করতে পারেন । আপনি এগুলি অনুলিপি করতে পারবেন না - কেবল তাদের সরান।

এটি পাত্রে যেমন ব্যবহার করা যায়, উদাহরণস্বরূপ std::vector<std::unique_ptr<T>>, যা বাইনারি-সামঞ্জস্যপূর্ণ এবং পারফরম্যান্সে অভিন্ন std::vector<T*>, তবে আপনি উপাদানগুলি মুছলে বা ভেক্টর সাফ করলে মেমরি ফাঁস হবে না। এটির তুলনায় এসটিএল অ্যালগরিদমের সাথে আরও ভাল সামঞ্জস্য রয়েছে ptr_vector

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


3

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

যাইহোক, যখন আপনার সংস্থানগুলি ট্র্যাক রাখা দরকার তখন পয়েন্টারগুলি পাস করা একমাত্র বিকল্প। কিছু ক্ষেত্রে রয়েছে:

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

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


1

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

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

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

সম্পাদনা: শেয়ার্ড-পয়েন্টারগুলির কার্য সম্পাদন সম্পর্কিত কয়েকটি বিষয় বিবেচনা করতে হবে:

  • রেফারেন্স কাউন্টারটি হ'ল বরাদ্দ।
  • আপনি যদি থ্রেড-সুরক্ষিত সক্ষম করে থাকেন তবে ইন্টারলকড ক্রিয়াকলাপের মাধ্যমে রেফারেন্স গণনা করা হবে।
  • মান দ্বারা পয়েন্টারটি পাস করা রেফারেন্স গণনাটি পরিবর্তিত করে যার অর্থ ইন্টারলকড অপারেশনগুলি সম্ভবত মেমরির এলোমেলো অ্যাক্সেস ব্যবহার করে (লকস + সম্ভবত ক্যাশে মিস)।

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

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

1
এটি এমন একটি সমস্যা যা আমি এএএ-স্টুডিওতে দেখেছি যে আমি কাজ করছি। আপনি অনিদ্রা গেমস, মাইক অ্যাক্টনে প্রধান স্থপতি শুনতে পারেন। আমি বলছি না যে বুস্ট একটি খারাপ লাইব্রেরি, এটি কেবল উচ্চ-পারফরম্যান্ট গেমগুলির জন্য উপযুক্ত নয়।
সাইমন

1
@ কেভিন 42: গেমের বিকাশে নিম্ন-স্তরের অপ্টিমাইজেশনের মূল উত্স সম্ভবত ক্যাশে সংহতি। @ সিমন: সর্বাধিক শেয়ারড_পিটার বাস্তবায়ন যে কোনও প্ল্যাটফর্মের লকগুলি এড়ায় যা তুলনা-ও-স্বাপকে সমর্থন করে, যার মধ্যে লিনাক্স এবং উইন্ডোজ পিসি রয়েছে এবং আমি বিশ্বাস করি যে এক্সবক্স অন্তর্ভুক্ত রয়েছে।

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

0

আমি সর্বত্র স্মার্ট পয়েন্টার ব্যবহার করার ঝোঁক রাখি। এটি পুরোপুরি ভাল ধারণা কিনা তা আমি নিশ্চিত নই, তবে আমি অলস, এবং আমি কোনও আসল ক্ষতি দেখতে পাচ্ছি না [যদি আমি কিছু সি-স্টাইল পয়েন্টার গাণিতিক করতে চাইতাম তবে)। আমি বুস্ট :: শেয়ার্ড_পিটার ব্যবহার করি কারণ আমি জানি যে আমি এটিকে প্রায় অনুলিপি করতে পারি - যদি দুটি সত্তা কোনও চিত্র ভাগ করে নেয় তবে যদি একজন মারা যায় তবে অন্যটিরও চিত্রটি হারাতে হবে না।

এর নেতিবাচক দিকটি হ'ল যদি কোনও বস্তু এটি নির্দিষ্ট করে এবং তার মালিকানাধীন কিছু মুছে ফেলে তবে অন্য কিছু এটির দিকেও নির্দেশ করে তবে তা মোছা হয় না।


1
আমি প্রায় সর্বত্র শেয়ার_পিটার ব্যবহার করে চলেছি - তবে আজ আমি কিছুটা ডেটার জন্য ভাগ করে নেওয়া মালিকানার প্রয়োজন কিনা তা ভাবার চেষ্টা করি। যদি তা না হয় তবে সেই ডেটাটিকে প্যারেন্ট ডেটা কাঠামোর জন্য একটি অ-পয়েন্টার সদস্য করা যুক্তিসঙ্গত হতে পারে। আমি দেখতে পেয়েছি যে স্পষ্ট মালিকানা ডিজাইনকে সহজতর করে।
jmp97

0

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


0

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

কর্মক্ষেত্রে অবশ্যই সমস্ত কিছু আলাদা, যদি না আমি প্রোটোটাইপ না করি, যা আমি কৃতজ্ঞতার সাথে অনেক কিছু করতে পারি।


0

এটি স্বতঃস্ফূর্তভাবে একটি অদ্ভুত উত্তর না হলেও প্রায় কোনওটিই নয় এবং সম্ভবত সবার জন্য উপযুক্ত কোথাও নেই।

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

একটি শুরুর জন্য:

  1. এটি -৪-বিট প্ল্যাটফর্মে অ্যানালগিকাল পয়েন্টারের মেমরির প্রয়োজনীয়তাগুলি অর্ধেক করে। এখনও অবধি আমার কোনও নির্দিষ্ট ডেটা টাইপের ~ 4.29 বিলিয়ন ডলারের বেশি প্রয়োজন নেই।
  2. এটি নিশ্চিত করে যে কোনও নির্দিষ্ট ধরণের সমস্ত উদাহরণ T, কখনও স্মৃতিতে খুব বেশি ছড়িয়ে যায় না। এটি সমস্ত ধরণের অ্যাক্সেস প্যাটার্নগুলির জন্য ক্যাশে মিসগুলি হ্রাস করতে পারে, এমনকি গাছের মতো লিঙ্কযুক্ত কাঠামোগুলিও যদি নোডারের পরিবর্তে সূচকগুলি ব্যবহার করে নোডগুলি সংযুক্ত করা হয় তবে তা অতিক্রম করে।
  3. সমান্তরাল ডেটা গাছ বা হ্যাশ টেবিলের পরিবর্তে সস্তা সমান্তরাল অ্যারে (বা স্পার্স অ্যারে) ব্যবহার করে সংযুক্ত হওয়া সহজ হয়ে যায়।
  4. সেট ছেদগুলি লিনিয়ার-টাইমে বা আরও ভাল ব্যবহার করে, একটি সমান্তরাল বিটসেট ব্যবহার করে পাওয়া যাবে।
  5. আমরা সূচকগুলি র‌্যাডিক্স করতে পারি এবং খুব ক্যাশে-বান্ধব অনুক্রমিক অ্যাক্সেস প্যাটার্ন পেতে পারি।
  6. একটি নির্দিষ্ট ডেটা টাইপের কী পরিমাণ উদাহরণ বরাদ্দ করা হয়েছে সে সম্পর্কে আমরা নজর রাখতে পারি।
  7. আপনি যদি এই ধরণের জিনিসটির প্রতি যত্নশীল হন তবে ব্যতিক্রম-সুরক্ষার মতো বিষয়গুলির সাথে মোকাবিলা করতে হবে এমন জায়গাগুলির সংখ্যা হ্রাস করে।

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

struct FooIndex
{
    int32_t index;
};

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

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

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

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

আমি এখনও মাঝে মাঝে রেফ-কাউন্টিং ব্যবহার করে শেষ করি না তবে এটিকে শেষ অবলম্বন কৌশলটির মতো আচরণ করি। এবং এমন কয়েকটি ঘটনা রয়েছে যেখানে অবিচ্ছিন্নভাবে ডেটা কাঠামোর প্রয়োগের মতো মালিকানা ভাগ করে নেওয়া সত্যই তা উপলব্ধি করে এবং সেখানে আমি এটি দেখতে পাই যে এই মুহুর্তে পৌঁছানোর উপযুক্ত ধারণাটি তৈরি shared_ptrকরে।

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

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