আমার ছাত্রদের কি বরাদ্দ শেখানো উচিত? [বন্ধ]


18

allocaবাস্তব বিশ্বে কতটা ব্যবহৃত হয় ? আমার ছাত্রদের allocaযখন তা বোধগম্য হয় তখন সেগুলি ব্যবহার করতে শেখানো উচিত ? বা আমি তাদের কখনই এটি ব্যবহার না করার শেখাতে পারি? একটি সি ++ আরএআইআই ব্যাকগ্রাউন্ড থেকে আসছে, freeম্যানুয়ালি কল না করার ধারণাটি প্রতিশ্রুতিবদ্ধ শোনায়, বিশেষত একাধিক প্রস্থান পয়েন্ট সহ ফাংশনে।


সম্পর্কিত: stackoverflow.com/questions/1018853/...

8
কেন তাদের C99 ভিএলএ পড়ান না?

@ সিনিকুতার বরাদ্দ () বাস্তবায়ন-নির্ভর কিন্তু কমপক্ষে অনেকগুলি বাস্তবায়ন ব্যর্থতার কারণে NULL ফিরিয়ে দেয়। C99 ভিএলএগুলির ব্যর্থতা নির্দেশ করার কোনও উপায় নেই।
জটিল

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

1
@ পাসলকুয়াক আপনি যেভাবেই হোক বরাদ্দ / ভিএলএস দিয়ে অনেক বেশি বরাদ্দ করা উচিত নয়। বর্তমান প্রসঙ্গে "প্রচুর পরিমাণ" কি তা নিশ্চিত না হলে ব্যবহার করুন malloc

উত্তর:


31

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

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


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

13

আমি দুটি জিনিস ঘটতে দেখতে পাচ্ছি:

  1. শিক্ষার্থীরা allocaস্ট্যাক এবং স্তূপের মধ্যে পার্থক্য সম্পর্কে পড়তে পারে এবং এর প্রভাব বুঝতে পারে এবং allocaসাবধানতার সাথে ব্যবহার করে । (অসম্ভাব্য)

  2. শিক্ষার্থীরা মনে করে "বাহ, mallocএটি free" সম্পর্কে উদ্বিগ্ন না হওয়ার মতো , "এটি অত্যধিকভাবে ব্যবহার করুন, স্ট্যাক ওভারফ্লো করুন এবং কী ঘটছে তার কোনও ধারণা নেই।

আমি মনে করি আপনি যদি বর্ণনা করে থাকেন তবে এটি আরও ভাল allocathen

#include <malloc.h>

int OverflowMyStack(int start) {
    if (start == 0)
        return 0;

    char * p = (char *)_alloca(4096);
    *p = '0';
    return OverflowMyStack(start - 1);
}

int main () {
    return OverflowMyStack(512);
} 

সূত্র: http://www.strchr.com/alloca

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


1
আমি মনে করি বেশিরভাগ শিক্ষার্থী উদাহরণ কোডটি দেখানোর পরেও দ্বিতীয় বিভাগে পড়ে।
রাইটফোল্ড

@ ডব্লিউটিপি - সম্ভবত, তবে সে কারণেই আপনি তাদের কী হতে পারে তা দেখানোর পরেও এটি ব্যবহার না করার কথা বলছেন।
ব্ল্যাকজ্যাক

4
কেন যে কোড ব্যবহার _allocaনা করে alloca? এবং কেন এটি ফলাফল ফেলে?
কিথ থম্পসন

5

এই প্রশ্নের উত্তরটি আপনার উদ্দেশ্যগুলি প্রথম স্থানে রয়েছে তার ভিত্তিতে হওয়া উচিত ।

আপনি কী এমন কাউকে শেখাতে চান যা ইতিমধ্যে জানে যে কীভাবে সি লিখতে হয় এবং বন্য অঞ্চলে বিদ্যমান সি কোড দিয়ে কাজ করতে হয়? যদি তা হয় তবে বরাদ্দ এবং অন্য কিছু আপনার সম্পর্কে বলুন।

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


2

না।

সি প্রোগ্রামারকে এমনকি বরাদ্দটির অস্তিত্ব সম্পর্কে সচেতন হওয়া উচিত, কারণ এটি ব্যবহার করা উত্তরাধিকার কোডটি বোঝা এবং ঠিক করা।

কোন ব্যবহার allocaহয়

  1. অকেজো, অর্থাৎ এটি তুচ্ছভাবে স্বয়ংক্রিয় স্টোরেজ সময়কাল, এর স্থির আকারের ভেরিয়েবল দ্বারা প্রতিস্থাপিত হতে পারে OR
  2. একটি বিপজ্জনক স্ট্যাক ওভারফ্লো ঘটতে অপেক্ষা করছে।

কয়েকটি চিন্তার পরীক্ষাগুলি বাদ দিয়ে যার জন্য আমি কখনই আসল-বিশ্বের উদাহরণ খুঁজে পাইনি, alloca(বা ভিএলএর) জন্য কোনও ব্যবহারের মামলা নেই যা হয় নিরর্থক বা দুর্বল নয় (উপরের 2 টির একটি ক্ষেত্রে)।


2
অবশ্যই, একেবারে কেউই সম্ভবত এটি দায়বদ্ধতার সাথে ব্যবহার করতে পারেন নি। কখনো না.
ডেড এমজি

কেবলমাত্র "দায়বদ্ধ" ব্যবহার allocহ'ল স্থির আকারের স্বয়ংক্রিয় অ্যারেগুলির সমান 100% এবং কম পোর্টেবল।
আর .. গিটিহাব বন্ধ করুন সহায়তা আইসিসি

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

যদি এটি কয়েক কেবি হয় এবং আপনি যদি নিশ্চিত হন যে আপনার কয়েকটি কেবি রয়েছে তবে আপনি কেবল T foo[5000];বা যা কিছু ব্যবহার করতে পারেন ।
আর .. গিথহাব বন্ধ করুন সহায়তা আইসিসি

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

1

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


0

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

-Wl,-stack=নতুন স্ট্যাক-আকারকে জিসিসিতে পাস করা সর্বাধিক স্ট্যাকের আকার বাড়ায়; আপনার প্রকল্পটি যদি alloca()কোনও নির্দিষ্ট প্রসঙ্গ-নির্ভর গভীরতার অতীতে বড় অস্থায়ী অ্যারেগুলি ব্যবহার করে বা বরাদ্দ দেয় বা পুনরাবৃত্তি ব্যবহার করে তবে আপনাকে এটি করতে হবে ।

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