সিতে `ফ্রি` মুক্ত হওয়ার জন্য বাইট সংখ্যাটি নেয় না কেন?


84

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

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

সুতরাং, সংক্ষেপে, কেন mallocএবং কেন এমনভাবে freeতৈরি করা হয়েছিল যে তাদের অভ্যন্তরীণভাবে বরাদ্দকৃত বাইটের সংখ্যা ট্র্যাক রাখতে হবে? এটি কি কেবল historicalতিহাসিক দুর্ঘটনা?

একটি ছোট সম্পাদনা: "আপনি কী বরাদ্দ করেছেন তার চেয়ে আলাদা পরিমাণ ছাড়লে কি হবে" এর মতো পয়েন্ট কয়েকজন লোক সরবরাহ করেছেন। আমার কল্পনা করা এপিআই-তে কেবল বরাদ্দকৃত বাইটের সংখ্যা মুক্ত করতে কেবল একজনের প্রয়োজন হতে পারে; কমবেশি মুক্ত করা কেবল ইউবি বা বাস্তবায়ন সংজ্ঞায়িত হতে পারে। যদিও আমি অন্যান্য সম্ভাবনা সম্পর্কে আলোচনাটিকে নিরুৎসাহিত করতে চাই না।


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

11
আমি বেশ কয়েকটি কারণ সম্পর্কে চিন্তা করতে পারি: ব্যবহারকারীদের যদি না প্রয়োজন হয় তবে এটি কেন করাতে হবে? ব্যবহারকারী যদি এটিকে ভুল করে? এটি যাইহোক এক ধরনের অনর্থক প্রশ্ন। যদি তারা অন্য পছন্দটি করে থাকে তবে আপনি এখনও কেন তা জিজ্ঞাসা করবেন।
BoBTFish

15
@ বুবটি ফিশ: এটি সি আমরা কথা বলছি, পাইথন বা এমনকি সি ++ নয়। ব্যবহারকারীর ইতিমধ্যে একটি ঘন! 1 টন করতে হবে যা তাকে করতে হবে না। এটি কোনও কারণ নয়।
ব্যবহারকারী541686

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

36
আপনি প্রোগ্রামারটিকে ব্লকের আকারে সঠিকভাবে পাস করার প্রয়োজন হতে পারে না, কারণ ফোন করা কলটি mallocব্লকের আকারটি জানে নাmallocপ্রায়শই অনুরোধের চেয়ে বড় একটি ব্লক প্রদান করে। সর্বোপরি , প্রোগ্রামার malloc()কলটিতে অনুরোধ করা আকারে পাস করতে পারে , যা প্রয়োগকারীকে মোটেই সহায়তা করবে না free()
বেন ভয়েগট

উত্তর:


97

ওয়ান-আর্গুমেন্ট free(void *)(ইউনিক্স ভি 7 তে প্রবর্তিত) এর আগের দুটি-যুক্তির চেয়ে আরও একটি বড় সুবিধা রয়েছে mfree(void *, size_t)যা আমি এখানে উল্লেখ করি নি: একটি যুক্তি freeনাটকীয়ভাবে প্রতিটি অন্যান্য এপিআইকে সহজতর করে যা হ্যাপ মেমরির সাথে কাজ করে । উদাহরণস্বরূপ, যদি freeমেমরি ব্লকের আকারের প্রয়োজন হয় strdupতবে কোনওভাবে এক (পয়েন্টার) এর পরিবর্তে দুটি মান (পয়েন্টার + আকার) প্রদান করতে হবে, এবং সি একক মানের রিটার্নের তুলনায় একাধিক মানের রিটার্নকে আরও জটিল করে তুলবে। পরিবর্তে char *strdup(char *)আমাদের লিখতে হবে char *strdup(char *, size_t *)অন্যথায় struct CharPWithSize { char *val; size_t size}; CharPWithSize strdup(char *)। (আজকাল সেই দ্বিতীয় বিকল্পটি বেশ লোভনীয় বলে মনে হচ্ছে, কারণ আমরা জানি যে NUL- সমাপ্ত স্ট্রিংগুলিই "কম্পিউটিংয়ের ইতিহাসের সবচেয়ে বিপর্যয়কর নকশা বাগ", কিন্তু এটি হিন্দ্দৃষ্টি বলছে। 70 এর দশকে ফিরে, সি হিসাবে স্ট্রিংগুলিকে সাধারণ হিসাবে পরিচালনা করার ক্ষমতা char *আসলে প্যাসকেল এবং আলগোলের মতো প্রতিযোগীদের তুলনায় একটি সংজ্ঞায়িত সুবিধা হিসাবে বিবেচিত হয়েছিল ।) এছাড়াও, এটি কেবল strdupএই সমস্যায় ভুগছে না - এটি প্রতিটি সিস্টেমকে প্রভাবিত করে - বা ব্যবহারকারী-সংজ্ঞায়িত ফাংশন যা হিপ মেমরি বরাদ্দ করে।

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

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

এবং এই নতুন ফাংশনগুলি ব্যবহার করে আপনি যত বেশি কোড লিখবেন তত বেশি ভয়ঙ্কর বলে মনে হয়। তারা শুধুমাত্র লিখতে আপনার কোড সহজ করতে, তারা এছাড়াও আপনার কোড করা দ্রুততর - দুটি জিনিস যা প্রায়ই একসঙ্গে যাবেন না! আপনি size_tপুরো স্থান জুড়ে এইগুলি পাস করার আগে , যা অনুলিপি করার জন্য সিপিইউ ওভারহেড যুক্ত করেছিল এবং এর অর্থ হল আপনাকে আরও প্রায়ই নিবন্ধগুলি ছড়িয়ে দিতে হয়েছিল (উদাহরণস্বরূপ অতিরিক্ত ফাংশন যুক্তির জন্য), এবং নষ্ট স্মৃতি (যেহেতু নেস্টেড ফাংশন কলগুলি প্রায়শই ফলস্বরূপ ঘটবে) size_tবিভিন্ন স্ট্যাক ফ্রেমে সংরক্ষণের একাধিক অনুলিপিগুলিতে )। আপনার নতুন সিস্টেমে, আপনার এখনও স্টোর সঞ্চয় করতে মেমরিটি ব্যয় করতে হবেsize_t, তবে কেবল একবার, এবং এটি কোথাও কখনও অনুলিপি করা হয় না। এগুলি ছোট দক্ষতার মতো মনে হতে পারে তবে মনে রাখবেন যে আমরা 256 কিবি র‌্যামের উচ্চতা সম্পন্ন মেশিনগুলির বিষয়ে কথা বলছি।

এটি আপনাকে খুশি করে! সুতরাং আপনি দাড়িওয়ালা পুরুষদের সাথে আপনার দুর্দান্ত কৌশলটি ভাগ করেছেন যারা পরের ইউনিক্স রিলিজে কাজ করছেন, তবে এটি তাদের খুশি করে না, এটি দুঃখ করে তোলে। আপনি দেখুন, তারা ঠিক যেমন নতুন কিছু ইউটিলিটি ফাংশন যুক্ত করার প্রক্রিয়ায় ছিল strdupএবং তারা বুঝতে পেরেছিল যে আপনার শীতল কৌশল ব্যবহার করে লোকেরা তাদের নতুন ফাংশনগুলি ব্যবহার করতে সক্ষম হবে না, কারণ তাদের নতুন ফাংশনগুলি সবগুলি বোঝার পয়েন্টার + আকার ব্যবহার করে এপিআই এবং তারপরে এটি আপনাকেও দু: খিত করে তোলে, কারণ আপনি বুঝতে পেরেছেন strdup(char *)যে সিস্টেম সংস্করণটি ব্যবহার করতে সক্ষম না হয়ে নিজের লেখার প্রতিটি প্রোগ্রামে আপনাকে নিজের ভাল ফাংশনটি আবার লিখতে হবে।

কিন্তু অপেক্ষা করো! এটি 1977, এবং পিছনে সামঞ্জস্যতা আরও 5 বছরের জন্য আবিষ্কার করা হবে না! আর তাছাড়া কেউ গুরুতর আসলে ব্যবহার তার ফেকাসে নাম দিয়ে এই অস্পষ্ট "ইউনিক্স" জিনিস। কেএন্ডআর-এর প্রথম সংস্করণটি এখন প্রকাশকের কাছে চলেছে, তবে এটি কোনও সমস্যা নয় - এটি প্রথম পৃষ্ঠায় সরাসরি বলেছে যে "সি অক্ষরযুক্ত স্ট্রিংয়ের মতো সংমিশ্রিত বস্তুগুলির সাথে সরাসরি ডিল করার জন্য কোনও ক্রিয়াকলাপ সরবরাহ করে না ... কোনও গাদা নেই is ... "। ইতিহাসের এই মুহুর্তে string.hএবং mallocএটি বিক্রেতার এক্সটেনশন (!)। সুতরাং, দাড়িওয়ালা ম্যান # 1 এর পরামর্শ দেয়, আমরা তাদের পছন্দমতো পরিবর্তন করতে পারি; কেন আমরা কেবলমাত্র আপনার ছদ্মবেশী বরাদ্দকারীকে সরকারী বরাদ্দকারী হিসাবে ঘোষণা করি না ?

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

এবং এখন সকলেই খুশি: আপনি আপনার সহজেই লেখার সহজ এবং দ্রুত কোডটি পান, দাড়িওয়ালা ম্যান # 1 একটি দুর্দান্ত সহজ লিখতে পেল strdupযা লোকেরা আসলে ব্যবহার করবে, এবং দাড়িওয়ালা ম্যান # 2 - তিনি আত্মবিশ্বাসী যে তিনি কিছুটা সময় রেখেছিলেন - - কুইন্সের সাথে ঘোরাঘুরি করতে ফিরে যায় । শিপ!

বা কমপক্ষে, এটি ঘটতে পারে কিভাবে ।


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

4
তুমি জিতেছ. এটি আমার কাছে সবচেয়ে প্রশংসনীয় ব্যাখ্যা (এবং লেখার সেরা অংশ) দেখাচ্ছে looks এমনকি যদি এখানে সমস্ত কিছু ভুল বা অবৈধ প্রমাণিত হয় তবে এটি দাড়ি করা পুরুষদের দুর্দান্ত চিত্রের জন্য সেরা উত্তর answer
জায়েমার - মনিকা

বাহ, এই পৃষ্ঠায় একটি উত্তর যা প্রকৃতপক্ষে কলুষিত মনে হয়। আমার কাছ থেকে +1
ব্যবহারকারী541686

আরও ভাল - এই পৃষ্ঠায় একটি উত্তর যা আসলে উপভোগযোগ্য! পাশাপাশি +1।
ডেভিড সি র্যাঙ্কিন 21

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

31

" freeসিতে কেন বাইটস মুক্ত করতে হবে না?"

কারণ এটির জন্য কোনও প্রয়োজন নেই, এবং এটি কোনওভাবেই বোঝা যায় না।

আপনি যখন কিছু বরাদ্দ করেন, আপনি সিস্টেমকে বলতে চান যে কতগুলি বাইট বরাদ্দ করতে হবে (স্পষ্ট কারণে)।

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

এবং এখন, আপনি যদি এটি মুক্ত করতে চান, আপনি কেবল মেমরি ম্যানেজার সিস্টেমটি বলতে পারেন: "এখানে এই পয়েন্টারটি, free()এটি যে ব্লকটিকে নির্দেশ করছে" " - এবং মেমরি পরিচালকটি এটি কীভাবে করবেন তা জানবেন, কারণ এটি আকারটি সুস্পষ্টভাবে জানে বা কারণ এটির এমনকি আকারের প্রয়োজনও নেই।

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


আমি যদি আপনার কাছ থেকে ১০০ ডলার ধার নিয়ে আবার আপনার কাছ থেকে আবারও ১০০ ডলার andণ নেন এবং তারপরে আরও পাঁচবার করে থাকেন, আপনি কি সত্যিই যত্নবান হন যে আমি আপনার কাছ থেকে সাতবার bণ নিয়েছি (যদি না আপনি আসলে সুদ নিচ্ছেন!) ?? অথবা আপনি কি যত্ন নিচ্ছেন যে আমি আপনার কাছ থেকে $ 700 ধার নিয়েছি? এখানে একই জিনিস: সিস্টেমটি কেবল মেমোরি সম্পর্কে চিন্তা করে না যা নির্বিঘ্নিত হয়, বরাদ্দ হওয়া মেমরিটি কীভাবে বিভক্ত হয় সে সম্পর্কে এটি (এবং প্রয়োজন এবং হওয়া উচিত নয়) যত্ন করে না।
ব্যবহারকারী541686

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

12
@ ব্যবহারকারী 3477950: এটি বাইট সংখ্যা পাস করার প্রয়োজন নেই : হ্যাঁ, কারণ এটি এইভাবে ডিজাইন করা হয়েছিল। ওপি জিজ্ঞাসা করল কেন এটি এইভাবে ডিজাইন করা হয়েছিল?
উত্সাহক

4
"কারণ এটির দরকার নেই" - এটি ঠিক যেমন নকশা করা যেতে পারে যাতে এটির প্রয়োজন হয় না।
ব্যবহারকারী 253751

4
@ মেহরদাদ যে একটি সম্পূর্ণ অস্পষ্ট এবং ত্রুটিযুক্ত উপমা। যদি আপনি চার বাইটকে একশবার বরাদ্দ করেন তবে আপনি অবশ্যই কোনটি মুক্ত করবেন তা সর্বাধিক গুরুত্বপূর্ণ does প্রথম একটিকে মুক্ত করা দ্বিতীয়টি মুক্ত করার মতো নয়। অন্যদিকে অর্থ দিয়ে আপনি প্রথম বা দ্বিতীয়
orrowণ

14

সি সি ++ এর মতো "বিমূর্ত" নাও হতে পারে তবে এটি এখনও সমাবেশের বিমূর্ততা হিসাবে লক্ষ্য করা যায়। সে লক্ষ্যে, নিম্ন-স্তরের বিশদটি সমীকরণের বাইরে নেওয়া হয়। এটি আপনাকে প্রান্তিককরণ এবং প্যাডিংয়ের বিষয়ে ঝগড়া করা থেকে বিরত রাখে, বেশিরভাগ অংশে, যা আপনার সমস্ত সি প্রোগ্রাম অ-বহনযোগ্য করে তোলে।

সংক্ষেপে, এটি একটি বিমূর্ততা লেখার সম্পূর্ণ পয়েন্ট


9
এর সাথে অ্যালাইনমেন্ট বা প্যাডিংয়ের কী আছে তা নিশ্চিত নয়। উত্তর আসলে কিছুই উত্তর দেয় না।
ব্যবহারকারী541686

4
@ মেহরদাদ সি কোনও x86 ভাষা নয়, এটি বহনযোগ্য হওয়ার চেষ্টা করে (কম বেশি) আপনি অন্য যে কোনও উপায়ে (যেমন ইনলাইন অ্যাসেমব্লি) সেভাবে পৌঁছে যেতে পারেন তবে বিমূর্ততা মূল key আমি এই উত্তরের সাথে একমত
মার্কো এ

4
@ মেহরদাদ: আপনি যদি mallocএন বাইটের জন্য জিজ্ঞাসা করেন এবং এটি পরিবর্তে পুরো পৃষ্ঠার শুরুতে একটি পয়েন্টার ফিরিয়ে দেয় ( প্রান্তিককরণ, প্যাডিং বা অন্যান্য বাধাগুলির কারণে) এটির জন্য ব্যবহারকারীকে কোনও উপায় রাখে না - তাদের বাধ্য করে এটি কি
প্রতিক্রিয়াশীল হবে

4
@ মিশেলফৌকারকিস: mallocবরাদ্দের আকারটি সংরক্ষণ না করে কেবল সর্বদা একটি সারিবদ্ধ পয়েন্টারটি ফিরিয়ে দিতে পারে। freeতারপরে সবকিছু যথাযথভাবে মুক্ত হয়েছে তা নিশ্চিত করার জন্য উপযুক্ত প্রান্তিককরণ পর্যন্ত ঘুরতে পারে। সমস্যাটি কোথায় আছে তা আমি দেখতে পাচ্ছি না।
ব্যবহারকারী541686

6
@ মেহরদাদ: আপনি যে উল্লিখিত অতিরিক্ত কাজের জন্য কোনও লাভ নেই। অতিরিক্তভাবে, ত্রুটিগুলির অন্য উত্স খোলার sizeজন্য একটি পরামিতি পাস freeকরা।
মাইকেল ফৌকারাকিস

14

আসলে, প্রাচীন ইউনিক্স কার্নেল মেমরি বরাদ্দকারী mfree()একটি sizeযুক্তি নিয়েছে। malloc()এবং mfree()দুটি অ্যারে রাখে (একটি মূল মেমোরির জন্য, অন্যটি অদলবদলের জন্য) যাতে ফ্রি ব্লক ঠিকানা এবং মাপের তথ্য থাকে।

ইউনিক্স ভি 6 (প্রোগ্রামগুলি কেবলমাত্র ব্যবহার করবে sbrk()) অবধি কোনও ব্যবহারকারী স্থান বরাদ্দকারী ছিল না । ইউনিক্স ভি In-এ, ইওলিবের সাথে একটি বরাদ্দকারী alloc(size)এবং একটি free()কল অন্তর্ভুক্ত ছিল যা একটি আকার যুক্তি গ্রহণ করে না। প্রতিটি মেমরি ব্লক এর আকার এবং পরবর্তী ব্লকের একটি পয়েন্টার দ্বারা পূর্ববর্তী ছিল। ফ্রি তালিকাটি হাঁটার সময় পয়েন্টারটি কেবলমাত্র বিনামূল্যে ব্লকগুলিতে ব্যবহৃত হত এবং ব্যবহারের ব্লকগুলিতে ব্লক মেমরি হিসাবে পুনরায় ব্যবহৃত হয়েছিল।

ইউনিক্স 32 ভি এবং ইউনিক্স ভি 7-এ, এটি একটি নতুন malloc()এবং free()বাস্তবায়নের দ্বারা প্রতিস্থাপিত হয়েছিল , যেখানে free()কোনও sizeযুক্তি গ্রহণ করেনি । বাস্তবায়নটি একটি বিজ্ঞপ্তিযুক্ত তালিকা ছিল, প্রতিটি অংশের আগে একটি শব্দ ছিল যা পরবর্তী অংশের একটি পয়েন্টার এবং "ব্যস্ত" (বরাদ্দ) বিট ছিল। সুতরাং, malloc()/free()এমনকি একটি সুস্পষ্ট আকারের ট্র্যাক রাখেনি।


10

freeসিতে বাইটগুলি মুক্ত করার সংখ্যাটি কেন নেয় না?

কারণ এর দরকার নেই। তথ্যটি ম্যালোক / ফ্রি দ্বারা সম্পাদিত অভ্যন্তরীণ পরিচালনায় ইতিমধ্যে উপলব্ধ।

এখানে দুটি বিবেচনা (যা এই সিদ্ধান্তে অবদান রাখতে পারে বা নাও পারে):

  • আপনি কেন কোনও ফাংশনটির প্রয়োজন নেই এমন প্যারামিটার পাওয়ার আশা করবেন?

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

  • freeএই ক্ষেত্রে পরিবর্তিত ফাংশনটি কী করবে ?

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

বরং আমি জানতে চাই যে ফ্রিটিকে প্রথম স্থানে কেন তৈরি করা হয়েছিল।

কারণ এটি এটি করার "যথাযথ" উপায়। কোনও এপিআই এর ক্রিয়াকলাপ সম্পাদনের জন্য প্রয়োজনীয় যুক্তিগুলির প্রয়োজন হওয়া উচিত এবং এর চেয়ে বেশি আর কিছু নয়

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

এটি বাস্তবায়নের সঠিক উপায়গুলি হ'ল:

  • (সিস্টেম স্তরে) malloc বাস্তবায়নের মধ্যে - প্রাপ্ত আকারের উপর ভিত্তি করে অভ্যন্তরীণভাবে বিভিন্ন কৌশল ব্যবহার করতে malloc লেখা থেকে গ্রন্থাগার প্রয়োগকারীকে থামানোর কিছুই নেই।

  • (অ্যাপ্লিকেশন পর্যায়ে) মেলোককে মোড়ানো এবং আপনার নিজের API এর মধ্যে বিনামূল্যে ব্যবহার করে এবং এর পরিবর্তে (আপনার অ্যাপ্লিকেশনটিতে যে কোনও জায়গায় আপনার প্রয়োজন হতে পারে) ব্যবহার করে।


6
@ ব্যবহারকারী 3477950: এটি বাইট সংখ্যা পাস করার প্রয়োজন নেই : হ্যাঁ, কারণ এটি এইভাবে ডিজাইন করা হয়েছিল। ওপি জিজ্ঞাসা করল কেন এটি এইভাবে ডিজাইন করা হয়েছিল?
উত্সাহীকারী

4
"কারণ এটির দরকার নেই" - এটি ঠিক সেইভাবে নকশা করা যেতে পারে যাতে সেই তথ্য সংরক্ষণ না করে এটির প্রয়োজন হয়।
ব্যবহারকারী 253751

4
আপনার পয়েন্ট 2 হিসাবে, আপনি আমাকে ভাবছেন যে ফ্রি (NUL) আচরণের সংজ্ঞা দেওয়া হয়েছে কিনা if আহা, "সমস্ত মান কোন সমিতি যেমন C লাইব্রেরি আচরণ বিনামূল্যে (নাল) এর অনুবর্তী সংস্করণ" - উৎস stackoverflow.com/questions/1938735/...
Mawg মনিকা পুনর্বহাল বলছেন

10

পাঁচটি কারণ মনে মনে বসন্ত:

  1. এটি সুবিধাজনক এটি প্রোগ্রামার থেকে পুরো ওভারহেডের পুরো বোঝা সরিয়ে দেয় এবং ত্রুটিগুলি ট্র্যাক করা অত্যন্ত কঠিন শ্রেণীর একটি শ্রেণিকে এড়িয়ে চলে।

  2. এটি একটি ব্লকের অংশ প্রকাশের সম্ভাবনা উন্মুক্ত করে। তবে যেহেতু মেমরি পরিচালকরা সাধারণত ট্র্যাকিংয়ের তথ্য রাখতে চান তা এটার অর্থ কী তা পরিষ্কার নয়?

  3. অরবিটে হালকাতা রেস প্যাডিং এবং প্রান্তিককরণ সম্পর্কে স্পট। মেমরি পরিচালনার প্রকৃতির অর্থ বরাদ্দ করা আসল আকারটি আপনি যে আকার চেয়েছিলেন তার চেয়ে সম্ভবত আলাদা। এর অর্থ এটি হ'ল freeএকটি আকারের পাশাপাশি প্রয়োজনীয় স্থানের mallocজন্য প্রয়োজনীয় স্থানটিও পরিবর্তন করতে হবে।

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

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

ঘটনাচক্রে, বিভিন্ন আকারের আইটেমগুলির জন্য পৃথক বরাদ্দকারীদের সম্পর্কে আপনার ধারণা এই তথ্য ছাড়াই সহজেই প্রয়োগ করা হয় (বরাদ্দটি কোথায় হয়েছে তা নির্ধারণ করতে আপনি ঠিকানাটি ব্যবহার করতে পারেন)। এটি নিয়মিত সি ++ এ করা হয়।

পরে যুক্ত হয়েছে

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

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

- * যদি কেউ এখনও এই বিষয়টি বুঝতে অসুবিধা বোধ করে থাকেন তবে এটি বিবেচনা করুন: একটি সাধারণ মেমরি বরাদ্দকারী একটি মেমরি ব্লক শুরু করার জন্য একটি সামান্য পরিমাণে ট্র্যাকিংয়ের তথ্য যোগ করে এবং এরপরে একটি পয়েন্টার অফসেট প্রদান করে। এখানে সঞ্চিত তথ্য সাধারণত পরবর্তী ফ্রি ব্লকের পয়েন্টারগুলি অন্তর্ভুক্ত করে, উদাহরণস্বরূপ। ধরা যাক যে শিরোনামটি মাত্র 4 বাইট দীর্ঘ (যা আসলে বেশিরভাগ বাস্তব লাইব্রেরির চেয়ে ছোট) এবং আকারটি অন্তর্ভুক্ত করে না, তারপরে কল্পনা করুন যে যখন ব্যবহারকারী একটি 16 বাইট ব্লক জিজ্ঞাসা করবে তখন আমাদের কাছে 20 বাইট ফ্রি ব্লক রয়েছে সিস্টেমটি 16 বাইট ব্লকটি ফিরিয়ে আনবে তবে তারপরে একটি 4 বাইট টুকরা ছেড়ে দেবে যা কখনই প্রতিবার সময় নষ্ট করার জন্য ব্যবহৃত হবে নাmallocডাকা হয়। পরিবর্তে যদি ম্যানেজারটি কেবল 20 বাইট ব্লকটি ফেরত দেয় তবে এটি এই অগোছালো টুকরোগুলি বাড়ানো থেকে বাঁচায় এবং উপলব্ধ মেমরিটিকে আরও পরিষ্কারভাবে বরাদ্দ করতে সক্ষম। কিন্তু যদি সিস্টেম সঠিকভাবে আকার নিজেই ট্র্যাকিং ছাড়া এই কাজ করতে হয় আমরা কি তবে ট্র্যাক করতে ব্যবহারকারী প্রয়োজন - যে, একক বরাদ্দ জন্য - মেমরির পরিমাণ আসলে যদি এটা এটা বিনামূল্যে জন্য ফিরে পাস হয় বরাদ্দ। একই যুক্তি প্রকারগুলি / বরাদ্দগুলির জন্য প্যাডিংয়ের ক্ষেত্রে প্রযোজ্য যা পছন্দসই সীমানা মেলে না। সুতরাং, সর্বাধিক, freeএকটি আকার নেওয়ার প্রয়োজন হয় (ক) সম্পূর্ণ অকেজো যেহেতু মেমরি বরাদ্দকারী প্রকৃত বরাদ্দ আকারের সাথে মেলানোর জন্য পাস করা আকারের উপর নির্ভর করতে পারে না বা (খ) অর্থহীনভাবে ব্যবহারকারীকে সত্যিকারের ট্র্যাকিংয়ের কাজ করতে হবে মাপ যা সহজেই কোনও বোধগম্য মেমরি পরিচালক দ্বারা পরিচালিত হবে।


# 1 সত্য। # 2: আপনি কী বোঝাতে চাইছেন তা নিশ্চিত নয়। # 3 সম্পর্কে তেমন নিশ্চিত নয়, প্রান্তিককরণের জন্য অতিরিক্ত তথ্য সংরক্ষণের প্রয়োজন হয় না। # 4 টি বিজ্ঞপ্তিযুক্ত যুক্তি; মেমরি পরিচালকদের কেবল প্রতি অংশে ওভারহেডের প্রয়োজন হয় কারণ তারা আকার সঞ্চয় করে, তাই তারা কেন আকারটি সংরক্ষণ করে তা যুক্তি হিসাবে আপনি এটি ব্যবহার করতে পারবেন না। এবং # 5 খুব বিতর্কযোগ্য।
ব্যবহারকারী541686

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

4
@ জাইম্মার: হ্যাঁ, এটা অকাল। আমি গ্রহণের আগে এক বা দুই দিনের বেশি অপেক্ষা করার পরামর্শ দিচ্ছি এবং আমি নিজে থেকে এটি সম্পর্কে চিন্তাভাবনা করার পরামর্শ দিচ্ছি। এটি একটি সত্যই আকর্ষণীয় প্রশ্ন এবং স্ট্যাকওভারফ্লো সম্পর্কিত যে কোনও "কেন" প্রশ্নের জন্য আপনি প্রথমে যে উত্তরগুলি পেয়ে যাবেন তা হ'ল প্রকৃত অন্তর্নিহিত প্রশ্নটি সমাধান করার পরিবর্তে বর্তমান সিস্টেমটিকে ন্যায়সঙ্গত করার আধা-স্বয়ংক্রিয় প্রচেষ্টা হবে।
ব্যবহারকারী541686

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

4
@ মেহরদাদ: ওহ, এবং # 3 এ, এটি অতিরিক্ত তথ্যের প্রয়োজন হয় না, এর জন্য অতিরিক্ত মেমরির প্রয়োজন হয় না। একটি সাধারণ মেমরি ম্যানেজার যা 16 বাইট অ্যালাইনমেন্টের সাথে কাজ করার জন্য ডিজাইন করা হয়েছে যখন একটি 115 বাইট ব্লকের জন্য জিজ্ঞাসা করা হয় তখন 128 বাইট ব্লকে একটি পয়েন্টার ফিরিয়ে দেয়। যদিfree কলটি মাপটি সঠিকভাবে ছাড়তে হয় তবে তা এটি অবশ্যই জেনে রাখা উচিত।
জ্যাক এইডলি

5

আমি কেবল এটি একটি উত্তর হিসাবে পোস্ট করছি কারণ এটিই নয় যে আপনি প্রত্যাশা করছেন, তবে কারণ আমি বিশ্বাস করি এটিই একমাত্র যুক্তিযুক্তভাবে সঠিক:

এটি সম্ভবত প্রাথমিকভাবে সুবিধাজনক বলে মনে করা হয়েছিল এবং এর পরে এটি আর উন্নত করা যায় নি।
এটির জন্য সম্ভবত কোন দৃinc়প্রত্যয়ী কারণ নেই। (তবে এটি ভুল হিসাবে দেখানো হলে আমি আনন্দের সাথে মুছে ফেলব))

সেখানে হবে বেনিফিট হলে সম্ভব ছিল: আপনি, যার মাপ পূর্বেই জানতেন মেমরি একটি একক বৃহৎ টুকরা বরাদ্দ পারে তারপর একটি সামান্য বিট একটি সময়ে বিনামূল্যে - যেমন বারবার বণ্টন এবং মেমরি ছোট খন্ডে freeing বিরোধিতা। বর্তমানে এর মতো কাজগুলি সম্ভব নয়।


আপনার অনেক (অনেক 1 !) যারা মনে করেন যে আকারটি পাস করা এত হাস্যকর:

std::allocator<T>::deallocateপদ্ধতির জন্য আমি কি আপনাকে সি ++ এর ডিজাইনের সিদ্ধান্তের বিষয়ে উল্লেখ করতে পারি ?

এলাকার সমস্ত বস্তু দ্বারা নির্দেশিতn Tp এই কল করার আগে নষ্ট হয়ে যাবে। এই স্মৃতি পেতে প্রাপ্ত
nমানটির সাথে মিলবে matchallocate

আমি মনে করি আপনার এই নকশার সিদ্ধান্তটি বিশ্লেষণ করার পরিবর্তে "আকর্ষণীয়" সময় হবে।


এর জন্য operator delete , এটি দেখা যাচ্ছে যে 2013 N3778 প্রস্তাব ("সি ++ আকারের সমাপ্তি") এটিও ঠিক করার উদ্দেশ্যে।


1 প্যারামিটারের অভাবকে ন্যায়সঙ্গত করার জন্য free" মাপের জন্য জিজ্ঞাসা করা কলটি সম্পূর্ণরূপে অকেজো" এর মতো কত তাড়াতাড়ি দাবি করেছিলেন তা দেখতে মূল প্রশ্নের অধীনে মন্তব্যগুলি কেবল দেখুন size


4
জন্য malloc()বাস্তবায়ন এটি মনে রাখা প্রয়োজন মুছে ফেলা হবে কিছু একটা বরাদ্দ অঞ্চল সম্পর্কে, প্রান্তিককরণ ওভারহেড থেকে বরাদ্দ ওভারহেড কমে যায়। malloc()মুক্ত বংশের মধ্যে সমস্ত বুককিপিং নিজে করতে সক্ষম হবে। ব্যবহারের ক্ষেত্রে রয়েছে যা এটির একটি বৃহত উন্নতি হবে। বেশ কয়েকটি ছোট ছোট অংশে মেমরির একটি বিশাল অংশকে হ্রাস করা নিরুৎসাহিত করতে হবে, যদিও এটি খণ্ডখণ্ডে মারাত্মকভাবে বৃদ্ধি পাবে।
cmaster - পুনর্বহাল মনিকা

4
@ মাস্টার: এই ব্যবহারের ঘটনাগুলি হুবহু আমি যেমন উল্লেখ করছি, আপনি মাথায় পেরেক চাপলেন, ধন্যবাদ। টুকরো টুকরো টুকরো সম্পর্কে: নিশ্চিত না যে এটি কীভাবে বিকল্পের সাথে খণ্ডিত বাড়ে, যা ছোট অংশগুলিতে বরাদ্দ এবং ফ্রি মেমরি উভয়ই to
ব্যবহারকারী541686

std::allocatorবরাদ্দ শুধুমাত্র একটি নির্দিষ্ট, পরিচিত আকারের উপাদান। এটি সাধারণ উদ্দেশ্যে বরাদ্দকারী নয়, তুলনা কমলাগুলিতে আপেল।
জ্যাক এইডলি

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

4
ক্লিফোর্ড: হুবহু - এজন্যই আমি বলেছিলাম যে এর কোন দৃinc় প্রত্যয় নেই। এটি কেবল একটি সিদ্ধান্ত নেওয়া হয়েছিল, এবং বিকল্পগুলির চেয়ে এটি কঠোরভাবে বিশ্বাস করার কোনও কারণ নেই।
ব্যবহারকারী541686

2

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


4
আমি মনে করি "কল্পনা সব [...] ত্রুটিগুলি" তর্ক করা হয় যখন আপনি মত অন্যান্য বাগ কারখানার মনে gets, printf, ম্যানুয়াল লুপ (বন্ধ-বাই-এক), অনির্ধারিত আচরণ, বিন্যাস-স্ট্রিং, অন্তর্নিহিত ধর্মান্তর, বিট ঠাট, এট সিটেরা
সেবাস্তিয়ান মাচ

1

আমি প্রস্তাব দিচ্ছি যে এটি হ'ল এই কারণেই ম্যানুয়ালি আকারের তথ্যগুলি ট্র্যাক না করা খুব সুবিধাজনক (কিছু ক্ষেত্রে) এবং প্রোগ্রামার ত্রুটির ঝুঁকিও কম।

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

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


1

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


এটি এমনকি একটি স্পষ্ট আকারের ক্ষেত্রের প্রয়োজন হয় না। এটিতে কেবল পরবর্তী ব্লকে একটি পয়েন্টার এবং একটি বরাদ্দ বিট থাকতে পারে।
নিনজালজ

0

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

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

আশা করি এটা সাহায্য করবে!


0

এটা কেন করা উচিত? malloc () এবং ফ্রি () ইচ্ছাকৃতভাবে খুব সাধারণ মেমরি পরিচালনার আদিম , এবং সি-তে উচ্চ স্তরের মেমরি পরিচালনা মূলত বিকাশকারীদের up টি

তবুও রিলোক () এটি ইতিমধ্যে করেছে - আপনি যদি রিলোক () এ বরাদ্দ কমিয়ে দেন তবে এটি ডেটা স্থানান্তরিত করবে না, এবং পয়েন্টারটি ফিরে পাওয়া আসলটির মতো হবে।

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

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


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

@rsaxvc: ভাল প্রশ্ন - cplusplus.com ডকুমেন্টগুলি "নতুন আকারটি যদি বড় হয় তবে সদ্য বরাদ্দকৃত অংশের মান অনির্ধারিত " " বোঝানো হচ্ছে যে এটি যদি ছোট হয় তবে এটি নির্ধারিত হয় । [ওপেনগ্রুপ.org () বলছে "মেমরি অবজেক্টের নতুন আকারের জন্য যদি বস্তুর চলন প্রয়োজন হয় তবে অবজেক্টটির পূর্ববর্তী ইনস্ট্যান্টেশনের স্থানটি খালি করা হবে।" - যদি এটি আরও কম হয় তবে ডেটা সরানোর দরকার পড়ত না। আবার জড়িত বিষয়টি হ'ল ছোটটি পুনরায় পুনঃস্থাপন করবে না। আইএসও স্ট্যান্ডার্ড কী বলে আমি নিশ্চিত নই।
ক্লিফোর্ড

4
reallocহয় একেবারে ডেটা স্থানান্তর করতে অনুমতি দেওয়া হয়েছে। সি মান অনুযায়ী এটি বাস্তবায়ন করতে সম্পূর্ণই বৈধ reallocহিসাবে একটি malloc+ + memcpy+ + free। এবং কার্যকর কারণগুলি আকারে হ্রাস হওয়া একটি বরাদ্দকে সরানোতে পারে এমন ভাল কারণ রয়েছে, উদাহরণস্বরূপ, খণ্ডিত মেমরি এড়ানোর জন্য।
নাথানিয়েল জে স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.