সুতরাং এটি কি একটি স্মৃতি ওভারহেড নয়?
হ্যাঁ .... না ... হতে পারে?
এটি একটি বিশ্রী প্রশ্ন, কারণ মেশিনে মেমরির ঠিকানা সম্পর্কিত পরিসীমা কল্পনা করুন এবং এমন একটি সফ্টওয়্যার যা অবিচ্ছিন্নভাবে ট্র্যাক করে রাখা উচিত যে জিনিসগুলি মেমরিতে কীভাবে এমনভাবে স্ট্যাকের সাথে বেঁধে রাখা যায় না।
উদাহরণস্বরূপ, এমন একটি সঙ্গীত খেলোয়াড়ের কল্পনা করুন যেখানে ব্যবহারকারী কোনও বোতাম চাপলে মিউজিক ফাইলটি লোড করা হয় এবং যখন ব্যবহারকারী অন্য সংগীত ফাইলটি লোড করার চেষ্টা করে তখন অস্থির স্মৃতি থেকে লোড হয়।
অডিও ডেটা কোথায় সঞ্চিত তা আমরা কীভাবে ট্র্যাক করব? আমাদের এটির একটি স্মৃতি ঠিকানা প্রয়োজন। প্রোগ্রামটি কেবল অডিও ডেটা খণ্ডকে মেমরির মধ্যে রাখে তা নয়, যেখানে এটি মেমরিতে থাকে সেগুলিও ট্র্যাক করে রাখা দরকার । সুতরাং আমাদের একটি মেমরি ঠিকানা (যেমন, একটি পয়েন্টার) প্রায় রাখা প্রয়োজন। এবং মেমরি ঠিকানার জন্য প্রয়োজনীয় স্টোরেজটির আকারটি মেশিনের ঠিকানা সীমার সাথে মিলিয়ে চলেছে (উদাহরণস্বরূপ: 64৪-বিট অ্যাড্রেসিং রেঞ্জের জন্য -৪-বিট পয়েন্টার)।
সুতরাং এটি "হ্যাঁ" ধরণের, এটির জন্য কোনও মেমরি ঠিকানার খোঁজ রাখার জন্য সঞ্চয়স্থান প্রয়োজন, তবে এটি এই জাতীয় গতিবেগের -র জন্য বরাদ্দকৃত মেমরির জন্য এড়াতে পারি না এমন নয়।
কীভাবে ক্ষতিপূরণ দেওয়া হয়?
নিজেই কেবল পয়েন্টারের আকারের বিষয়ে কথা বললে, আপনি কিছু ক্ষেত্রে স্ট্যাকটি ব্যবহার করে ব্যয়টি এড়াতে পারেন, উদাহরণস্বরূপ, সংকলকগুলি নির্দেশক তৈরি করতে পারে যা কোনও পয়েন্টারের ব্যয়কে এড়িয়ে আপেক্ষিক মেমরি ঠিকানার কার্যকরভাবে কোড কোড করে। তবুও এটি যদি আপনার বৃহত, পরিবর্তনশীল-আকারের বরাদ্দের জন্য করেন এবং ব্যবহারকারীর ইনপুট দ্বারা চালিত জটিল সিরিজের একটি জটিল সিরিজের জন্য অবাস্তবিক (একেবারে অসম্ভব নাও) হতে চান (অডিও উদাহরণ হিসাবে) উপরে)।
আরও একটি উপায় হ'ল আরও নিখুঁত ডেটা কাঠামো ব্যবহার করা। উদাহরণস্বরূপ, দ্বিগুণ-সংযুক্ত তালিকার পরিবর্তে অ্যারে-ভিত্তিক ক্রম ব্যবহার করা যেতে পারে যার জন্য নোডের জন্য দুটি পয়েন্টার প্রয়োজন। আমরা এই দুটির একটি হাইব্রিড একটি অনিবন্ধিত তালিকার মতোও ব্যবহার করতে পারি যা এন উপাদানগুলির প্রতিটি সংগত গ্রুপের মধ্যে কেবল পয়েন্টার সঞ্চয় করে।
পয়েন্টারগুলি কি সমালোচনামূলক কম মেমোরি অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয়?
হ্যাঁ, খুব সাধারণভাবে তাই হয়, হিসাবে অনেক কর্মক্ষমতা-সমালোচনামূলক অ্যাপ্লিকেশন C অথবা সি ++ যা পয়েন্টার ব্যবহার দ্বারা প্রভাবিত হয় লেখা হয় (তারা একটি স্মার্ট পয়েন্টার বা মত একটি ধারক পিছনে হতে পারে std::vector
বা std::string
কিন্তু অন্তর্নিহিত বলবিজ্ঞান একটি পয়েন্টার যা ব্যবহার করা হয় ফুটাইয়া কমান গতিশীল মেমরি ব্লকে ঠিকানার ট্র্যাক রাখতে)।
এখন এই প্রশ্নে ফিরে:
কীভাবে ক্ষতিপূরণ দেওয়া হয়? (অংশ দুই)
পয়েন্টারগুলি সাধারণত ময়লা সস্তার হয় যদি না আপনি সেগুলির দশ মিলিয়ন (যা এখনও 64৪-বিট মেশিনে একটি পরিমাপ * 8 মেগাবাইট)।
* নোট হিসাবে উল্লেখ করেছেন যে একটি "পরিমাপক" 8 ম্যাগ এখনও এল 3 ক্যাশে আকারের। এখানে আমি মোট ডিআরএএম ব্যবহারের অর্থে "পরিশ্রমী" বেশি ব্যবহার করেছি এবং মেমোরির সাথে সম্পর্কিত আপেক্ষিক আকারটি পয়েন্টারগুলির একটি স্বাস্থ্যকর ব্যবহার নির্দেশ করবে।
যেখানে পয়েন্টারগুলি ব্যয়বহুল হয় সেগুলি পয়েন্টারগুলি নয় তবে:
গতিশীল মেমরি বরাদ্দ। গতিশীল মেমরির বরাদ্দ ব্যয়বহুল হয়ে থাকে কারণ এটি কোনও অন্তর্নিহিত ডেটা স্ট্রাকচারের মধ্য দিয়ে যেতে হয় (উদা: বন্ধু বা স্ল্যাব বরাদ্দকারী)। যদিও এগুলি প্রায়শই মৃত্যুর জন্য অনুকূলিত হয়, এগুলি সাধারণ উদ্দেশ্য এবং ভেরিয়েবল-আকারের ব্লকগুলি হ্যান্ডেল করার জন্য ডিজাইন করা হয় যার জন্য প্রয়োজন হয় তারা "অনুসন্ধান" এর মতো কমপক্ষে কিছু কাজ করতে পারে (যদিও হালকা ওজন সম্ভবত এমনকি ধ্রুবক সময়ও) স্মৃতিতে একটি নিখরচায় পৃষ্ঠাগুলির সেট সন্ধান করুন।
মেমরি অ্যাক্সেস। এটি উদ্বিগ্ন হওয়ার জন্য বড় ওভারহেড হতে পারে। যখনই আমরা প্রথমবারের জন্য গতিময়ভাবে বরাদ্দকৃত মেমরি অ্যাক্সেস করি, তখন একটি বাধ্যতামূলক পৃষ্ঠা ত্রুটি থাকে এবং সেই সাথে মেমরির স্তরবিন্যাসকে নিচে এবং একটি নিবন্ধে মেমরিটিকে সরিয়ে নিয়ে যাওয়া ক্যাশে মিস হয় না।
মেমরি অ্যাক্সেস
মেমরি অ্যাক্সেস হল অ্যালগরিদমের বাইরে পারফরম্যান্সের সবচেয়ে গুরুত্বপূর্ণ দিক aspects এএএ গেম ইঞ্জিনগুলির মতো প্রচুর পারফরম্যান্স-সমালোচনামূলক ক্ষেত্রগুলি তাদের শক্তির ডেটা-ভিত্তিক অনুকূলকরণের দিকে অনেক বেশি ফোকাস করে যা আরও দক্ষ মেমরি অ্যাক্সেসের নিদর্শন এবং বিন্যাসে ফোটায়।
উচ্চ-স্তরের ভাষাগুলির মধ্যে সবচেয়ে বড় পারফরম্যান্সের অন্যতম অসুবিধা যা প্রতিটি ব্যবহারকারী-সংজ্ঞায়িত প্রকার আলাদাভাবে কোনও আবর্জনা সংগ্রাহকের মাধ্যমে বরাদ্দ করতে চান, উদাহরণস্বরূপ, তারা স্মৃতিটিকে কিছুটা ভাঙতে পারে। এটি বিশেষত সত্য হতে পারে যদি সমস্ত বস্তু একবারে বরাদ্দ না হয়।
এই ক্ষেত্রে, আপনি যদি কোনও ব্যবহারকারী-সংজ্ঞায়িত অবজেক্ট টাইপের মিলিয়ন দৃষ্টান্তের একটি তালিকা সঞ্চয় করেন, তবে লুপগুলিতে ক্রমিকভাবে সেই দৃষ্টান্তগুলি অ্যাক্সেস করা বেশ ধীর হতে পারে কারণ এটি মিলিয়ন পয়েন্টারের তালিকার সাথে সমান যা মেমরির পৃথক অঞ্চলগুলিকে নির্দেশ করে। এই ক্ষেত্রে, আর্কিটেকচার বড়, সারিবদ্ধ অংশগুলিতে উচ্চ স্তরের, ধীরে ধীরে, উচ্চ স্তরের স্তরের স্মৃতি ফর্মটি আনতে চায় এই আশায় যে এই খণ্ডগুলির আশেপাশের ডেটাগুলি উচ্ছেদের আগে অ্যাক্সেস করা হবে। যখন এই জাতীয় তালিকার প্রতিটি বস্তু পৃথকভাবে বরাদ্দ করা হয়, তখন প্রায়শই আমরা ক্যাশ মিসের সাহায্যে তার জন্য অর্থ প্রদান শেষ করি যখন প্রতিটি পরবর্তী পুনরাবৃত্তিকে মেমরিতে সম্পূর্ণ ভিন্ন অঞ্চল থেকে লোড করতে হতে পারে যেখানে উচ্ছেদ করার আগে কোনও সংলগ্ন বস্তু অ্যাক্সেস করা হত না।
এই জাতীয় ভাষার জন্য প্রচুর সংকলক নির্দেশাবলী নির্বাচনের সময় এবং বরাদ্দ রেজিস্ট্রেশনে এই দিনগুলিতে সত্যিই দুর্দান্ত কাজ করছেন, তবে এখানে মেমরি পরিচালনার উপর আরও সরাসরি নিয়ন্ত্রণের অভাব হত্যাকারী হতে পারে (যদিও প্রায়শই কম ত্রুটিযুক্ত) এবং এখনও ভাষা পছন্দ করে সি এবং সি ++ বেশ জনপ্রিয়।
অপ্রত্যক্ষভাবে পয়েন্টার অ্যাক্সেস অনুকূলিতকরণ
সর্বাধিক কর্মক্ষমতা-সমালোচনামূলক পরিস্থিতিতে, অ্যাপ্লিকেশনগুলি প্রায়শই মেমরি পুল ব্যবহার করে যা রেফারেন্সের স্থানীয়তা উন্নত করতে স্বতন্ত্র অংশগুলি থেকে মেমরি পুল করে। এই জাতীয় ক্ষেত্রে, এমনকি কোনও গাছের মতো লিঙ্কযুক্ত কাঠামো বা লিঙ্কযুক্ত তালিকেও ক্যাশে-বান্ধব করে তোলা যেতে পারে যদি তার নোডগুলির মেমরি লেআউট প্রকৃতির সাথে সামঞ্জস্যপূর্ণ হয়। এটি পয়েন্টারকে কার্যকরভাবে সস্তা করে তুলছে তুলনামূলকভাবে তুলনামূলকভাবে রেফারেন্সের সাথে জড়িত রেফারেন্সের লোকালটি উন্নত করে ind
চারদিকে পয়েন্টারদের তাড়া করছে
ধরুন আমাদের কাছে এককভাবে লিঙ্কযুক্ত তালিকা রয়েছে:
Foo->Bar->Baz->null
সমস্যাটি হ'ল আমরা যদি এই সমস্ত নোডগুলি একটি সাধারণ-উদ্দেশ্য বরাদ্দকারী (এবং সম্ভবত সমস্ত একসাথে নয়) এর বিপরীতে আলাদাভাবে বরাদ্দ করি তবে আসল স্মৃতিটি কিছুটা এভাবে ছড়িয়ে দেওয়া হতে পারে (সরলীকৃত চিত্র):
আমরা যখন পয়েন্টারগুলির চারপাশে তাড়া শুরু করি এবং Foo
নোডটি অ্যাক্সেস করি তখন আমরা একটি বাধ্যতামূলক মিস (এবং সম্ভবত একটি পৃষ্ঠা ত্রুটি) দিয়ে তার মেমরি অঞ্চল থেকে মেমরির ধীর অঞ্চলগুলি থেকে মেমরির দ্রুত অঞ্চলগুলিতে সরিয়ে নিয়ে শুরু করি:
এটি আমাদের কেবলমাত্র একটি অংশ অ্যাক্সেস করতে এবং এই তালিকাটির চারপাশে পয়েন্টারগুলি তাড়া করার সাথে সাথে বাকী অংশটি উচ্ছেদ করার জন্য একটি মেমরি অঞ্চলকে ক্যাশে (সম্ভবত পৃষ্ঠাটিও) রাখে causes মেমরি বরাদ্দকারীকে নিয়ন্ত্রণে রাখার মাধ্যমে, তবে আমরা এই জাতীয় একটি তালিকা স্বচ্ছতার সাথে বরাদ্দ করতে পারি:
... এবং এর মাধ্যমে আমরা এই পয়েন্টারগুলিকে ডিফারেন্ট করতে এবং তাদের পয়েন্টিকে প্রক্রিয়াজাত করতে পারি সেই গতিতে উল্লেখযোগ্যভাবে উন্নতি করব। সুতরাং, খুব পরোক্ষ হলেও, আমরা এভাবে পয়েন্টার অ্যাক্সেস গতিতে পারি। অবশ্যই যদি আমরা এইগুলিকে কেবল একটি অ্যারেতে সঞ্চিত করে রাখি তবে আমাদের প্রথমে এই সমস্যাটি থাকবে না, তবে এখানে লিখিত কাঠামোর প্রয়োজন হলে মেমরির বরাদ্দকারী আমাদের মেমরি লেআউটের উপর সুস্পষ্ট নিয়ন্ত্রণ প্রদান করতে পারে day
* দ্রষ্টব্য: এটি মেমরির শ্রেণিবিন্যাস এবং রেফারেন্সের স্থানীয়তা সম্পর্কে একটি খুব বেশি চিত্রিত চিত্র এবং আলোচনা, তবে আশা করি এটি প্রশ্নের মাত্রার জন্য উপযুক্ত।