সি ++, ফ্রি-স্টোর বনাম হিপ


124

সঙ্গে ডায়নামিক বরাদ্দ new/deleteউপর সঞ্চালিত বললেন ফ্রি-দোকান ,
যখন malloc/freeঅপারেশন ব্যবহার গাদা

বাস্তবে সত্যিকারের পার্থক্য আছে কিনা তা জানতে চাই।
সংকলকগণ কি দুটি পদের মধ্যে পার্থক্য তৈরি করে? ( ফ্রি স্টোর এবং হিপ , নেই new/malloc)

উত্তর:


76

Http://www.gotw.ca/gotw/009.htm দেখুন ; এটি গাদা এবং ফ্রি-স্টোরের মধ্যে পার্থক্যগুলি আমার চেয়ে অনেক বেশি ভালভাবে বর্ণনা করতে পারে:

ফ্রি-দোকান:

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

গাদা:

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


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

2
এটাই হল পরিভাষার প্রশ্ন, ইমো। বলুন, মি। স্ট্রাস্ট্রপ 'হিপ' এবং 'ফ্রি স্টোর' পার্থক্য করে না: স্ট্রাউটস্ট্রপ.com / প্রগ্রামিং / ১17_ফ্রি_স্টোর.পিপিটি , স্লাইড ১২. 'হিপ' সি ++ এর অনেক আগে ডায়নামিক মেমোরির প্রতিশব্দ হিসাবে ব্যবহৃত হয়েছিল, যেহেতু লিস্প সময় (1960) ব্যবহৃত হয়েছিল মেমরি বরাদ্দের জন্য হিপ ডেটা স্ট্রাকচার।
আলেক্সি ওয়য়েটেনকো

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

67

সি ++ এর জন্য, ফ্রি স্টোর এবং হিপগুলির মধ্যে পার্থক্য নিখুঁতভাবে ধারণাগত হয়ে উঠেছে। বাগ সংগ্রহের জন্য জারের মতো এবং কুকি সংগ্রহের জন্য একটি। একটির এক উপায়ে লেবেলযুক্ত, অন্যটি other এই পদচিহ্নটি বোঝায় আপনি যে বিন্দুটি " new" এবং " delete" " malloc" " realloc" " " "অথবা" free"(অথবা এই বিষয়টির জন্য বিট স্তর সেটগুলি) মিশ্রিত করেন না home

সাক্ষাত্কারের সময় এটি বলা ভাল যে " newএবং deleteফ্রি স্টোরটি ব্যবহার করুন , mallocএবং freeগাদাটি ব্যবহার করুন; newএবং deleteযথাক্রমে নির্মাতা এবং ধ্বংসকারীকে কল করুন mallocএবং freeকরবেন না।" তবুও, আপনি প্রায়শই শুনতে পাবেন যে মেমরির বিভাগগুলি একই অঞ্চলে রয়েছে - তবে এটি সংকলক নির্দিষ্ট হতে পারে, অর্থাত্ উভয়ই আলাদা মেমরি স্পেসকে পুল হিসাবে নির্ধারণ করতে পারে (এটি কেন হবে তা নিশ্চিত নয়) যদিও)।


28

মাইক কোভালের উত্তর তত্ত্বটি বেশ ভালভাবে জুড়েছে। বাস্তবে, তবে এগুলি প্রায় সবসময় মেমরির একই অঞ্চলে থাকে - বেশিরভাগ ক্ষেত্রে আপনি যদি সংকলকটির বাস্তবায়নটি খনন করেন তবে newআপনি এটি কল পাবেন malloc()

অন্য কথায়: মেশিনের দৃষ্টিকোণ থেকে, হিপ এবং ফ্রি স্টোর একই জিনিস। কম্পাইলারের ভিতরে পার্থক্য বিদ্যমান।

জিনিসগুলিকে আরও বিভ্রান্ত করার জন্য, সি ++ এর আবির্ভাবের আগে আমরা "হিপ" বলছিলাম যার অর্থ এখন "ফ্রি স্টোর" called


5

"হিপ" শব্দটি একটি নির্দিষ্ট ডেটা কাঠামোকেও বোঝায়, তবে সি ++ ম্যালোকের প্রসঙ্গে, ফ্রি, নতুন এবং মুছে ফেলা অপারেশনগুলি "হিপ" এবং "ফ্রি স্টোর" শব্দটি কমবেশি বিনিময়যোগ্য হিসাবে ব্যবহৃত হয়।


3

গাদা এবং ফ্রি-স্টোরটি আন্তঃযোগযোগ্য হওয়ার কথা নয়। সি ++ 11 স্ট্যান্ডার্ড লাইব্রেরি সহ এভিআর 8-বিট মাইক্রো কন্ট্রোলারের মতো সীমাবদ্ধ প্রসঙ্গে, তারা এমনকি একই প্রোগ্রামে ব্যবহার করা যাবে না। ফ্রি স্টোর এবং হিপগুলি তাদের বরাদ্দগুলি একই মেমোরি স্পেসে করে, একে অপরের কাঠামো এবং ডেটা ওভাররাইট করে। এই প্রসঙ্গে, ফ্রি স্টোর হ্যাপের সাথে পৃথক এবং বেমানান কারণ "" নতুন / মুছে ফ্রি স্টোর লাইব্রেরি "" ম্যালোক / ফ্রি / রিলোক / কলোক হ্যাপ লাইব্রেরি "এর চেয়ে সহজ (এবং দ্রুত) এবং এইভাবে বিশাল মেমরির ব্যবহারের লাভ সরবরাহ করে সি ++ এম্বেড প্রোগ্রামার (এমন একটি প্রসঙ্গে যেখানে আপনার র‌্যামের মাত্র 512 বাইট থাকে)।

8 বিট সি ++ 11/14 স্ট্যান্ডার্ড লাইব্রেরি https://github.com/ambroise-leclerc/ETL/tree/master/libstd এ দেখুন


2

push_heapএট আল-এর মতো হ্যাপ ফাংশনগুলির বিবরণ ব্যতীত আমি হিপ শব্দের উল্লেখ করে থাকা আদর্শটি কখনও মনে করতে পারি না । সমস্ত গতিশীল বরাদ্দ ফ্রি-স্টোরে করা হয়।


1

ফ্রি স্টোর হল এমন একটি প্রোগ্রাম যা বরাদ্দ না দেওয়া হিপ মেমরির একটি প্রোগ্রাম যা প্রোগ্রামের সঞ্চালনের সময় গতিশীল বরাদ্দের জন্য প্রোগ্রাম দ্বারা ব্যবহৃত হয়। প্রতিটি প্রোগ্রামে আন-বরাদ্দ হ্যাপ মেমরির পুল সরবরাহ করা হয় যা এটি কার্যকর করার সময় ব্যবহার করতে পারে। উপলভ্য মেমরির এই পুলটিকে প্রোগ্রামের ফ্রি স্টোর হিসাবে উল্লেখ করা হয়। বরাদ্দ করা ফ্রি স্টোর মেমরিটি নামবিহীন।

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