আমি সি ++ 11 সমাপ্তি সম্পর্কে কীভাবে সঠিকভাবে চিন্তা করতে পারি এবং std::function
সেগুলি কীভাবে প্রয়োগ করা হয় এবং কীভাবে মেমরি পরিচালনা করা হয় সে সম্পর্কে আমি কিছু তথ্য চাই ।
যদিও আমি অকালীন অপ্টিমাইজেশনে বিশ্বাস করি না, নতুন কোড লেখার সময় আমার পছন্দগুলির পারফরম্যান্স প্রভাবটি সাবধানতার সাথে বিবেচনা করার অভ্যাস আমার আছে। আমি যথাযথ পরিমাণে রিয়েল-টাইম প্রোগ্রামিংও করি, যেমন মাইক্রোকন্ট্রোলারগুলিতে এবং অডিও সিস্টেমগুলির জন্য, যেখানে অ-নিরস্তাত্মক মেমরি বরাদ্দ / বিলোপ বিরামগুলি এড়ানো উচিত।
অতএব আমি কখন সি ++ ল্যাম্বডাস ব্যবহার করবেন বা ব্যবহার করবেন না সে সম্পর্কে আরও ভাল ধারণা বিকাশ করতে চাই।
আমার বর্তমান বোধগম্যতা হল যে কোনও ল্যাপডা ক্যাপচার বন্ধ না করে হ'ল সি কলব্যাকের মতো। যাইহোক, যখন পরিবেশটি হয় মান দ্বারা বা রেফারেন্স দ্বারা ক্যাপচার করা হয় তখন স্ট্যাকের উপর একটি বেনামে বস্তু তৈরি হয়। যখন কোনও ফাংশন থেকে কোনও মান-সমাপ্তি ফিরে আসতে হবে, একজন এটিকে আবৃত করে std::function
। এক্ষেত্রে ক্লোজার স্মৃতিতে কী ঘটে? এটি স্ট্যাক থেকে গাদা পর্যন্ত অনুলিপি করা হয়েছে? এটি যখনই মুক্তি পায় তখনই কি তা মুক্ত std::function
হয়, অর্থাত্ এটি কি রেখার মতো রেফারেন্স-গণনা করা হয় std::shared_ptr
?
আমি কল্পনা করি যে একটি রিয়েল-টাইম সিস্টেমে আমি ল্যাম্বডা ফাংশনগুলির একটি শৃঙ্খলা স্থাপন করতে পেরেছি, বি এর সাথে একটি ধারাবাহিকতা যুক্তি হিসাবে পাস করেছি, যাতে একটি প্রসেসিং পাইপলাইন A->B
তৈরি হয়। এই ক্ষেত্রে, এ এবং বি ক্লোজারগুলি একবার বরাদ্দ করা হবে। যদিও আমি নিশ্চিত নই যে এগুলি স্ট্যাকের বা গাদাতে বরাদ্দ দেওয়া হবে কিনা। তবে সাধারণভাবে এটি রিয়েল-টাইম সিস্টেমে ব্যবহার করা নিরাপদ বলে মনে হয়। অন্যদিকে যদি বি কিছু ল্যাম্বদা ফাংশন সি তৈরি করে, যা এটি ফিরে আসে, তবে সি এর জন্য মেমরি বরাদ্দ করা হবে এবং বারবার ক্ষয় করা হবে, যা রিয়েল-টাইম ব্যবহারের জন্য গ্রহণযোগ্য হবে না।
সিউডো কোডে, একটি ডিএসপি লুপ, যা আমি মনে করি রিয়েল-টাইম নিরাপদ হতে চলেছে। আমি প্রসেসিং ব্লক A এবং তারপরে বি সম্পাদন করতে চাই, যেখানে A তার যুক্তি কল করে। এই দুটি ফাংশনই std::function
বস্তুগুলি ফেরত দেয় , সুতরাং f
একটি std::function
বস্তু হবে, যেখানে এর পরিবেশটি গাদাতে সংরক্ষণ করা হয়:
auto f = A(B); // A returns a function which calls B
// Memory for the function returned by A is on the heap?
// Note that A and B may maintain a state
// via mutable value-closure!
for (t=0; t<1000; t++) {
y = f(t)
}
এবং যা আমার মনে হয় রিয়েল-টাইম কোডে ব্যবহার করা খারাপ হতে পারে:
for (t=0; t<1000; t++) {
y = A(B)(t);
}
এবং এমন এক যেখানে আমার মনে হয় স্ট্যাক মেমরি সম্ভবত বন্ধের জন্য ব্যবহৃত হবে:
freq = 220;
A = 2;
for (t=0; t<1000; t++) {
y = [=](int t){ return sin(t*freq)*A; }
}
পরের ক্ষেত্রে বন্ধটি লুপের প্রতিটি পুনরাবৃত্তিতে নির্মিত হয়, তবে পূর্ববর্তী উদাহরণের বিপরীতে এটি সস্তা কারণ এটি ঠিক একটি ফাংশন কলের মতো, কোনও গাদা বরাদ্দ দেওয়া হয় না। তদুপরি, আমি ভাবছি যে যদি কোনও সংকলক বন্ধটি "উত্তোলন" করতে পারে এবং ইনলাইনিং অপটিমাইজেশন করতে পারে।
এটা কি সঠিক? ধন্যবাদ.
operator()
। কোনও "উত্তোলন" করার দরকার নেই, ল্যাম্বডাস বিশেষ কিছু নয়। তারা স্থানীয় ফাংশন অবজেক্টের জন্য কেবলমাত্র একটি স্বল্প হাত।