সি এবং সি ++ এর মতো ভাষার কেন জঞ্জাল সংগ্রহ নেই? [বন্ধ]


57

ঠিক আছে, আমি জানি যে সি ++ তে ম্যালোক / ফ্রি এবং মেমরি ম্যানেজমেন্টের জন্য নতুন / ইউজিং-এ-ডেস্ট্রাক্টরের মতো জিনিস রয়েছে তবে আমি ভাবছিলাম যে এই ভাষাগুলিতে "নতুন আপডেটগুলি" কেন নেই যা ব্যবহারকারীর অনুমতি দেয়? ম্যানুয়ালি ম্যানুয়ালি পরিচালনা করার বিকল্প রয়েছে, না সিস্টেমটি স্বয়ংক্রিয়ভাবে এটি করার জন্য (আবর্জনা সংগ্রহ) করতে পারে?

কিছুটা নতুন-ইশ প্রশ্ন, তবে কেবল সিএসে প্রায় এক বছর ধরে রয়েছেন।


9
আমরা এই সেমিস্টারে আইফোন বিকাশের একটি মডিউল পেয়েছি। অ্যান্ড্রয়েডের জন্য অ্যাপ্লিকেশনগুলিকে 2 বছর কোডিংয়ের পরে, এই প্রশ্নটি বেশিরভাগ ক্লাসে চমকপ্রদ struck কেবলমাত্র এখনই আমরা দেখতে পাচ্ছি যে জাভা আসলে কত ঘন্টা আমাদের বাঁচিয়েছে বাজে মেমরি পরিচালনার ত্রুটিগুলি খুঁজে না নেওয়ার এবং বয়লার প্লেট কোডটি না লিখে।
সিয়ামি

7
@ নুল ইউজারএক্সেপশন, যেহেতু এটি মেমরির পুনর্বিবেচনার কোনও উপায় নির্দিষ্ট করে না যা বেশিরভাগই একটি জিসিকে বোঝায়।
উইনস্টন ইওয়ার্ট

1
@ bizso09: আপনি এখনও এআরসি তাকান? রেফারেন্স গণনার জন্য আপনি যখন সিস্টেম-সমর্থন পেয়েছেন তখন ধীর / চর্বি / অ-
নিরোধক জিসির দরকার নেই

3
এই বেশ ভাল প্রশ্নের উত্তরগুলি ধর্মীয় বুলি পূর্ণ।
abatishchev

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

উত্তর:


71

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

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


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

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

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

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

14
জাভা বা সি # ব্যবহার রেফারেন্স গণনা নয়: রেফারেন্স গণনার উপর ভিত্তি করে জিসি স্কিমগুলি তুলনায় তুলনামূলকভাবে বেশ আদিম এবং আধুনিক আবর্জনা সংগ্রহকারীদের তুলনায় অনেক খারাপ সম্পাদন করে (মূলত কারণ যখনই আপনি কোনও রেফারেন্স অনুলিপি করেন তখন রেফারেন্স গণনাগুলিতে পরিবর্তন করতে মেমরি লিখতে হবে!)
মাইক্রা

44

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

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


2
সামগ্রিক ভাল উত্তরের জন্য +1 এক, তবে বিশেষত "প্রদত্ত দামটি হ'ল সি ভাষা সঠিক, বাগ ফ্রি কোড লেখার ক্ষেত্রে খুব কম সহায়তা সরবরাহ করে"
শিবান ড্রাগন

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

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

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

"যে কোনও স্ট্যান্ডার্ড কমপ্লায়েন্ট বাস্তবায়ন" সত্য নয়, কেবল স্ট্যান্ডার্ড কমপ্লায়েন্ট হোস্ট পরিবেশ বাস্তবায়নের জন্য implementation কিছু প্ল্যাটফর্ম / স্ট্যান্ডার্ড লাইব্রেরি, বেশিরভাগ 8 বা 16-বিটের এম্বেড মাইক্রোকন্ট্রোলারের জন্য সরবরাহ করে না malloc()বা সরবরাহ করে না free()। (উদাহরণস্বরূপ পিআইসির এমএলএপি-কম্পাইলাররা)
12431234123412341234123

32

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

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

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

এই পদ্ধতির উপকারিতা এবং বিপরীতে রয়েছে: বিপরীতটি হ'ল জিসিকে সমর্থন করে এমন কোনও ভাষায় গাদা বরাদ্দ স্ট্যাক বরাদ্দের তুলনায় দ্রুত করে না এমন এবং ক্ষয়ক্ষতিটি হ'ল যে বস্তুগুলির কোনওটি ধ্বংস হওয়ার আগে পরিষ্কার-পরিচ্ছন্নতার প্রয়োজন হয় either একটি পৃথক প্রক্রিয়া প্রয়োজন (উদাহরণস্বরূপ সি # 'এর usingকীওয়ার্ড) বা অন্যথায় তাদের ক্লিনআপ কোড অ-নিরস্তামূলকভাবে চালিত হয়।

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

সি ++ এর কী আছে এবং সি ++ প্রোগ্রামাররা নিয়মিত যা ব্যবহার করেন তা হ'ল স্মার্ট পয়েন্টার , যা সত্যিই কেবল একটি রেফারেন্স-গণনা প্রক্রিয়া। আমি রেফারেন্স গণনাটিকে "সত্য" জিসি হিসাবে বিবেচনা করব না, তবে এটি ম্যানুয়াল মেমরি পরিচালনা বা সত্য জিসির তুলনায় ধীর পারফরম্যান্সের ব্যয় করে অনেকগুলি একই সুবিধা প্রদান করে, তবে নির্মূলবাদী ধ্বংসের সুবিধা নিয়ে।

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


4
এটি প্রশ্নের আসল উত্তর
c:

1
সি ++ অংশের জন্য, আজকাল আপনার উচিত স্ট্যান্ড :: ইউনিক_পিটার এবং এসটিডি :: চাল :) এর দিকে নজর দেওয়া উচিত
নিক্লাস লারসন

@ নিক্লাসলারসন: আমি নিশ্চিত নই যে আমি আপনার বক্তব্যটি বুঝতে পেরেছি। আপনি কি বলছেন যে std::unique_ptr"অস্বচ্ছ রেফারেন্সের জন্য ভাষা-স্তরের সমর্থন"? (এটি যে ধরণের সমর্থন আমি বলতে চাইছিলাম তা ছিল না, এবং সি ++ থেকে সরাসরি মেমরির হেরফেরের জন্য সমর্থনও সরিয়ে না দেওয়া পর্যন্ত আমি যথেষ্ট বলে মনে করি না।) আমি আমার উত্তরে স্মার্ট পয়েন্টারগুলির উল্লেখ করব এবং আমি std:unique_ptrএকটি স্মার্ট পয়েন্টার বিবেচনা করব , যেহেতু এটি প্রকৃতপক্ষে রেফারেন্স গণনা করে, তাই এটি কেবলমাত্র বিশেষ ক্ষেত্রে সমর্থন করে যেখানে রেফারেন্সের সংখ্যা হয় শূন্য বা একটি (এবং std::moveএটি রেফারেন্স গণনা আপডেট করার পদ্ধতি)।
ড্যানিয়েল প্রাইডেন

std::unique_ptrএকটি রেফারেন্স গণনা নেই এবং std::moveরেফারেন্সগুলির সাথে কিছু করার নেই (সুতরাং "না" পারফরম্যান্স হিট)। আমি আপনার বক্তব্যটি দেখতে পাচ্ছি, যেমনটি std::shared_ptrএকটি রেফারেন্স গণনাও রয়েছে যা ফলস্বরূপ আপডেট করেছে std::move:)
নিক্লাস লারসন

2
@ মাইক :76: বরাদ্দের দিক থেকে, একজন জিসি বরাদ্দকারী স্ট্যাক বরাদ্দের তত দ্রুত কাজ করবে এবং জিসি একই সাথে কয়েক হাজার বস্তুকে অপসারণ করতে পারে। আপনি একটি পুনঃনিরোধক বাস্তবায়ন দিয়ে যা করেন তা নির্ধারণ করা নয়, বরাদ্দ এবং অবলম্বন কখনই mallocএবং এর চেয়ে দ্রুত হবে না free। হ্যাঁ, একটি জিসি যথেষ্ট দ্রুততর হতে পারে। (নোট করুন যে আমি বলেছিলাম "হতে পারে" - অবশ্যই প্রতিটি প্রোগ্রামের সঠিক পারফরম্যান্স অনেকগুলি কারণ দ্বারা প্রভাবিত হয়।)
ড্যানিয়েল প্রাইডেন

27

কারণ, সি ++ পাওয়ার ব্যবহার করার সময় কোনও প্রয়োজন নেই।

ভেষজ সুটার: " আমি কয়েক বছরে মুছতে লিখিনি " "

দেখতে আধুনিক সি ++ কোড লেখা: কিভাবে সি ++ বছরের পর বছর ধরে বিকশিত করেনি 21:10

এটি অনেক অভিজ্ঞ সি ++ প্রোগ্রামারকে অবাক করে দিতে পারে।


মজাদার. আজকের জন্য আমার পড়া উপাদান।
surfasb

বাহ, একটি ভিডিও। তবে এর চেয়ে কম কখনই আকর্ষণীয় নয়।
surfasb

2
আকর্ষণীয় ভিডিও 21 মিনিট, এবং 55 মিনিটে সেরা বিট ছিল। খুব খারাপ উইনআরটি কলগুলি এখনও সি ++ / সিএলআই বাম্প বলে মনে হচ্ছে।
gbjbaanb

2
@ ডান04: এটি সত্য। তবে, আপনি যদি সিটিতে লিখেন, আপনি যা চান তা পেয়ে যান।
ডেডজিএম

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

15

"সমস্ত" একটি আবর্জনা সংগ্রহকারী এমন একটি প্রক্রিয়া যা মেমোরিতে কোনও অবাস্তব বস্তু আছে এবং সেগুলি মুছে ফেলা হয়েছে কিনা তা পর্যায়ক্রমে পরীক্ষা করে চলে। (হ্যাঁ, আমি জানি এটি একটি স্থূল ওভারসিম্প্লিফিকেশন)। এটি ভাষার কোনও সম্পত্তি নয়, কাঠামো।

সি এবং সি ++ এর জন্য রচিত আবর্জনা সংগ্রহকারী রয়েছে - এটি উদাহরণস্বরূপ।

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


1
কিন্তু ভবিষ্যতে লিখিত প্রোগ্রামগুলি আবর্জনা সংগ্রহকারী ব্যবহার শুরু করবে, না?
অন্ধকার টেম্পলার 21

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

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

2
@ থোরজ্বার্নআরভানএন্ডারসন: আমি একটি বৈধ সি প্রোগ্রাম লিখতে পারি যা পয়েন্টারগুলিকে এমনভাবে সঞ্চয় করে যাতে কোনও আবর্জনা সংগ্রহকারী তাদের খুঁজে না পায়। যদি আপনি কোনও আবর্জনা সংগ্রাহককে ঝুঁকেন mallocএবং free, আপনি আমার সঠিক প্রোগ্রামটি ভেঙে ফেলবেন।
বেন ভয়েগট

2
@ থরবজর্ন রাভানএন্ডারসন: না, আমি এটি শেষ না করা freeপর্যন্ত ফোন করব না। তবে আপনার প্রস্তাবিত আবর্জনা সংগ্রহকারী যা আমি স্পষ্টভাবে কল freeনা করা পর্যন্ত মেমরিটি মুক্ত করে না কোনও আবর্জনা সংগ্রহকারী নয়।
বেন ভয়েগট

12

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


9

আমার কাছে সঠিক উদ্ধৃতি নেই তবে বজর্ন এবং হার্ব সাটার উভয়ই লাইন ধরে কিছু বলেছেন:

সি ++ এর কোনও আবর্জনা সংগ্রাহকের দরকার নেই, কারণ এতে কোনও আবর্জনা নেই।

আধুনিক সি ++ এ আপনি স্মার্ট পয়েন্টার ব্যবহার করেন এবং তাই কোনও আবর্জনা নেই।


1
স্মার্ট পয়েন্টার কি?
অন্ধকার টেম্পলার 21

11
যদি এটি সহজ ছিল, কেউ কোনও জিসি বাস্তবায়ন করতে পারত না।
ডেডালনিক্স

7
@ ডেডালনিক্স: ঠিক, কারণ কেউ কখনই অতিরিক্ত জটিল, ধীর, ফুলে যাওয়া বা অপ্রয়োজনীয় কিছু প্রয়োগ করে না। সমস্ত সফ্টওয়্যার সবসময় 100% দক্ষ, তাই না?
Zach

5
@ ডেডালনিক্স - মেমরি পরিচালনার ক্ষেত্রে সি ++ পদ্ধতির বর্জ্য সংগ্রহকারীদের তুলনায় নতুন is আরআইআই সি ++ এর জন্য বাজনার স্ট্রস্ট্রপ আবিষ্কার করেছিলেন। ডেস্ট্রাক্টর ক্লিনআপ একটি পুরানো ধারণা, তবে ব্যতিক্রম-সুরক্ষা নিশ্চিত করার নিয়মগুলি মূল। আমি জানি না ঠিক কখন এই ধারণাটি প্রথম বর্ণিত হয়েছিল তবে 1998 সালে প্রথম সি ++ স্ট্যান্ডার্ড চূড়ান্ত হয়েছিল এবং স্ট্রোসপ্রেসস "সি ++ এর ডিজাইন এবং বিবর্তন" প্রকাশিত হয়নি 1994 সাল পর্যন্ত এবং ব্যতিক্রমগুলি সি ++ - এর তুলনায় সাম্প্রতিকতম সংযোজন ছিল ১৯৯০ সালে "অ্যানোটেটেড সি ++ রেফারেন্স ম্যানুয়াল" প্রকাশের পরে, আমি বিশ্বাস করি। জিসি 1959 সালে লিস্পের জন্য আবিষ্কার করা হয়েছিল।
স্টিভ 314

1
@ ডেডালনিক্স - আপনি কি জানেন যে কমপক্ষে একজন জাভা ভিএম একটি রেফারেন্স-কাউন্টিং জিসি ব্যবহার করেছেন যা প্রায় (প্রায়) সি ++ - স্টাইল আরআইআই ব্যবহার করে একটি স্মার্ট পয়েন্টার ক্লাস ব্যবহার করে প্রয়োগ করা যেতে পারে - অবিকল কারণ এটি বিদ্যমান ভিএমগুলির তুলনায় মাল্টিথ্রেডেড কোডের জন্য বেশি দক্ষ ছিল? Www.research.ibm.com/people/d/dfb/papers/Bacon01Concurrent.pdf দেখুন। বাস্তবে আপনি এটি সি ++ তে না দেখেন তার একটি কারণ হ'ল সাধারণ জিসি সংগ্রহ - এটি চক্র সংগ্রহ করতে পারে তবে চক্রের উপস্থিতিতে নিরাপদ ডেস্ট্রাক্টর অর্ডার চয়ন করতে পারে না এবং এটি নির্ভরযোগ্য ডেস্ট্রাক্টর ক্লিনআপ নিশ্চিত করতে পারে না।
স্টিভ 314

8

Askচ্ছিক আবর্জনা সংগ্রহকারীকে অন্তর্ভুক্ত করার জন্য এই ভাষাগুলিকে কেন আপডেট করা হয়নি তা আপনি জিজ্ঞাসা করেন।

Garbageচ্ছিক আবর্জনা সংগ্রহের সমস্যাটি হ'ল আপনি বিভিন্ন মডেল ব্যবহার করে এমন কোডটি মেশাতে পারবেন না। এটি হ'ল, যদি আমি এমন কোড লিখি যা ধরে নিয়েছে যে আপনি কোনও আবর্জনা সংগ্রহকারী ব্যবহার করছেন আপনি এটি আপনার প্রোগ্রামে এটি ব্যবহার করতে পারবেন না যা আবর্জনা সংগ্রহ বন্ধ করে দিয়েছে। আপনি যদি করেন তবে এটি সর্বত্র ফাঁস হবে।


6

আবর্জনা সংগ্রহের সাথে আপনি কী কোনও ভাষায় একটি ডিভাইস হ্যান্ডলার লেখার কল্পনা করতে পারেন? জিসি চলাকালীন কয়টি বিট লাইনে নামতে পারে?

নাকি একটি অপারেটিং সিস্টেম? এমনকি কার্নেলটি শুরু করার আগে আপনি কীভাবে জঞ্জাল সংগ্রহ চলমান শুরু করতে পারেন?

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


2
সি উচ্চ স্তরের জন্য ভাল? আমি আমার কীবোর্ড জুড়ে আমার পানীয়টি শামুক করেছিলাম।
ডেড এমএমজি

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

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

6

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

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

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


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

@ স্টিভ 314: আমি এটি দেখতে আগ্রহী যে যদি আপনি কখনও মনে করেন তবে কোথায় পেয়েছেন!
hugomg

খুঁজে পেয়েছি! ক্লিন ভিএম উল্লেখ করে স্ট্যাকওভারফ্লো / প্রশ্ন / 3317329/… মন্তব্যগুলি দেখুন । সমস্যাটি খুঁজে পাওয়ার অংশ - প্রশ্নটি বন্ধ ছিল।
স্টিভ 314

বিটিডাব্লু - আমি আমার মন্তব্য @ মিসিংনো দিয়ে শুরু করতে অক্ষম বলে মনে করি - কি দেয়?
স্টিভ 314

@ স্টিভ ৩১৪: এই থ্রেডটির সাথে উত্তরটি জড়িত থাকার পরে আমি ইতিমধ্যে সমস্ত মন্তব্যের জন্য একটি বিজ্ঞপ্তি পেয়েছি। এই ক্ষেত্রে একটি @ -post করছেন অপ্রয়োজনীয় হবে এবং দঃপূঃ দ্বারা অনুমোদিত নয় (আমাকে জিজ্ঞাসা করবেন না কেন যদিও)। (যদিও আসল কারণ আমার নম্বরটি অনুপস্থিত)
hugomg

5

সহ বিভিন্ন সমস্যা রয়েছে ...

  • যদিও সিসি +++ এর আগে এবং সম্ভবত সি এর আগে উদ্ভাবিত হয়েছিল, সিসি ব্যাপকভাবে ব্যবহারিক হিসাবে গ্রহণযোগ্য হওয়ার আগেই সি এবং সি ++ উভয়ই প্রয়োগ করা হয়েছিল।
  • অন্তর্নিহিত নন-জিসি ভাষা ছাড়া আপনি সহজেই কোনও জিসি ভাষা এবং প্ল্যাটফর্ম প্রয়োগ করতে পারবেন না।
  • যদিও সাধারণত টাইমস্কেলস ইত্যাদিতে বিকাশিত সাধারণত অ্যাপ্লিকেশন কোডের জন্য জিসি নন-জিসির চেয়ে বেশি দক্ষ, তবে এমন সমস্যা রয়েছে যেখানে আরও বিকাশের প্রচেষ্টা একটি ভাল বাণিজ্য-বন্ধ এবং বিশেষায়িত মেমরি পরিচালন একটি সাধারণ-উদ্দেশ্যে জিসিকে ছাড়িয়ে যাবে। তদতিরিক্ত, সি ++ সাধারণত কোনও অতিরিক্ত বিকাশ প্রচেষ্টা ছাড়াই বেশিরভাগ জিসি ভাষার চেয়ে বেশি কার্যকর efficient
  • GC সি ++ - স্টাইল RAII এর চেয়ে সর্বজনীনভাবে নিরাপদ নয়। RAII মেমরি ছাড়া অন্য সংস্থানগুলি স্বয়ংক্রিয়ভাবে পরিষ্কার হওয়ার অনুমতি দেয়, কারণ এটি নির্ভরযোগ্য এবং সময়োপযোগী ধ্বংসকারীদের সমর্থন করে। রেফারেন্স চক্র সংক্রান্ত সমস্যাগুলির কারণে এগুলি প্রচলিত জিসি পদ্ধতির সাথে একত্রিত করা যায় না।
  • জিসি ভাষাগুলির নিজস্ব বৈশিষ্ট্যযুক্ত মেমরি ফুটো রয়েছে, বিশেষত স্মৃতি সম্পর্কিত যা আর কখনও ব্যবহার করা হবে না, তবে যেখানে বিদ্যমান রেফারেন্স বিদ্যমান ছিল সেগুলি কখনই বাতিল বা ওভাররাইট করা হয়নি। এটিকে সুস্পষ্টভাবে করার প্রয়োজনটি নীতিগতভাবে প্রয়োজনের deleteবা freeসুস্পষ্টভাবে আলাদা নয় । জিসি পদ্ধতির এখনও একটি সুবিধা রয়েছে - কোনও ঝুঁকিপূর্ণ উল্লেখ নেই - এবং স্থির বিশ্লেষণ কিছু ক্ষেত্রে ধরতে পারে, তবে আবার সব ক্ষেত্রেই এর সঠিক সমাধান নেই।

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

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

আমার সম্পর্কিত উত্তরগুলিতে পুনরায় বেশ্যা লিঙ্কগুলি ...


4

আবর্জনা সংগ্রহ ডিএমএ-সক্ষম হার্ডওয়ারের জন্য ড্রাইভার বিকাশের জন্য ব্যবহৃত একটি সিস্টেমের ভাষার সাথে মূলত বেমানান।

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

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

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


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

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

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

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

3

কারণ, সি ও সি ++ হ'ল তুলনামূলকভাবে নিম্ন স্তরের ভাষা যা সাধারণ উদ্দেশ্যে বোঝানো হয়, এমনকি উদাহরণস্বরূপ, এম্বেড থাকা সিস্টেমে 1 এমবি মেমরির সাথে একটি 16-বিট প্রসেসর চালানো, যা জিসি সহ স্মৃতি নষ্ট করতে পারে না।


1
"এম্বেড সিস্টেম"? সি স্ট্যান্ডার্ড করা হয়েছিল (1989), এটি 1 এমবি মেমরি সহ পিসি হ্যান্ডেল করতে সক্ষম হওয়া দরকার needed
dan04

আমি একমত, আমি আরও একটি বর্তমান উদাহরণ উদ্ধৃত করছি।
পেট্রুজা

1MB ??? হোলি স্কমলে, কার এত বেশি র‌্যাম লাগবে? </billGates>
কে কে কোয়ান

2

সি ++ এবং সি তে আবর্জনা সংগ্রহকারী রয়েছে এটি নিশ্চিত নয় যে এটি সি তে কীভাবে কাজ করে তবে সি ++ এ আপনি আপনার বস্তুর গ্রাফটি গতিশীলভাবে আবিষ্কার করতে এবং এটি আবর্জনা সংগ্রহের জন্য ব্যবহার করতে আরটিটিআই ব্যবহার করতে পারেন।

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

জাভা এবং সি / সি ++ এর মধ্যে মূল পার্থক্যটি হ'ল সি / সি ++ এর মধ্যে পছন্দটি সর্বদা আপনার হয়, তবে জাভাতে আপনি প্রায়শই ডিজাইনের বিকল্প ছাড়াই চলে যান।


এবং এও যে নিবেদিত আবর্জনা সংগ্রহকারীরা আরও কার্যকরভাবে প্রয়োগ করা হয়, আরও দক্ষ এবং ভাষায় আরও ভাল ফিট করে। :)
সর্বাধিক

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

2

এটি কার্য সম্পাদন এবং সুরক্ষার মধ্যে একটি বাণিজ্য।

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

অবশ্যই সুবিধাটি হ'ল যে কোনও পয়েন্টার ছাড়াই বা মেমরি ফাঁস ছাড়াই একটি ভাষা তৈরি করতে পারে, সুতরাং সঠিক কোড তৈরির সম্ভাবনা বেশি।

এই বিতর্কগুলির মাঝে মাঝে কিছুটা 'ধর্মীয়' প্রান্ত থাকতে পারে - সতর্কতা অবলম্বন করুন!


1

এখানে জিসির অন্তর্নিহিত সমস্যার একটি তালিকা রয়েছে যা এটি সি-এর মতো সিস্টেমের ভাষায় অকেজো করে তোলে:

  • জিসিকে কোডগুলির স্তরের নীচে চলতে হবে যার পদগুলি এটি পরিচালনা করে। কার্নেলের মধ্যে এমন কোনও স্তর নেই।

  • একজন জিসিকে সময়ে সময়ে পরিচালিত কোড বন্ধ করতে হয়। এখন চিন্তা করুন যে এটি যদি আপনার কর্নেলের সাথে করে তবে কি হবে। আপনার মেশিনের সমস্ত প্রসেসিং এক মিলিসেকেন্ডের জন্য বলা হবে, যখন জিসি সমস্ত বিদ্যমান মেমোরি বরাদ্দ স্ক্যান করে। এটি এমন সিস্টেম তৈরির সমস্ত প্রয়াসকে মেরে ফেলবে যা কঠোর বাস্তব-সময়ের প্রয়োজনীয়তার অধীনে কাজ করে।

  • জিসিকে পয়েন্টার এবং অ-পয়েন্টারগুলির মধ্যে পার্থক্য করতে সক্ষম হওয়া প্রয়োজন। এটি হ'ল এটি অবশ্যই অস্তিত্বের প্রতিটি স্মৃতি বস্তুর দিকে নজর রাখতে সক্ষম হবে এবং অফসেটের একটি তালিকা তৈরি করতে সক্ষম হবে যেখানে এর পয়েন্টারগুলি পাওয়া যাবে।

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

    এটির জন্য একেবারে প্রয়োজন যে প্রকারের প্রতিটি অস্তিত্বের মধ্যে তথ্য সংরক্ষণ করা হয়। তবে সি এবং সি ++ উভয়ই সাদামাটা পুরানো ডেটা অবজেক্টের জন্য মঞ্জুরি দেয় যা কোনও ধরণের তথ্য রাখে না।

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

সি এবং সি ++ এমন ভাষা যা সমস্ত সম্ভাব্য ব্যবহারের ক্ষেত্রে সমর্থন করার জন্য তৈরি করা হয় support এবং, যেমন আপনি দেখতে পাচ্ছেন, এর মধ্যে অনেকগুলি ব্যবহারের কেস আবর্জনা সংগ্রহের দ্বারা বাদ দেওয়া হয়েছে। সুতরাং, এই ব্যবহারের ক্ষেত্রে সমর্থন করার জন্য, সি / সি ++ জঞ্জাল সংগ্রহ করা যাবে না।

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