আপনি যদি পারফরম্যান্স চান তবে মান দিয়ে স্টোর করে রাখুন।
ধরুন আপনার কাছে "ইউআই থ্রেডে এটি চালান" নামে একটি ফাংশন রয়েছে।
std::future<void> run_in_ui_thread( std::function<void()> )
যা "ui" থ্রেডে কিছু কোড চালায়, তারপরে এটি future
সম্পন্ন হওয়ার সংকেত দেয় । (ইউআই ফ্রেমওয়ার্কগুলিতে দরকারী যেখানে ইউআই থ্রেড যেখানে আপনার ইউআই উপাদানগুলির সাথে গোলযোগ হওয়ার কথা)
আমাদের দুটি স্বাক্ষর রয়েছে যা আমরা বিবেচনা করছি:
std::future<void> run_in_ui_thread( std::function<void()> ) // (A)
std::future<void> run_in_ui_thread( std::function<void()> const& ) // (B)
এখন, আমরা নিম্নলিখিত হিসাবে এটি ব্যবহার করতে পারে:
run_in_ui_thread( [=]{
// code goes here
} ).wait();
যা কোনও বেনামে বন্ধ (একটি ল্যাম্বডা) তৈরি করবে, এর মধ্যে একটি তৈরি std::function
করবে, এটি run_in_ui_thread
ফাংশনে পাস করবে , তারপরে এটি মূল থ্রেডে চলমান শেষ হওয়ার জন্য অপেক্ষা করুন।
ক্ষেত্রে (এ), std::function
আমাদের ল্যাম্বদা থেকে সরাসরি নির্মিত হয়, যা পরে এর মধ্যে ব্যবহার করা হয় run_in_ui_thread
। ল্যাম্বদাটি move
ডি তে প্রবেশ করানো হয়েছে std::function
, সুতরাং যে কোনও চলনীয় স্থিতি দক্ষতার সাথে এটিতে চালিত হয়।
দ্বিতীয় ক্ষেত্রে, একটি অস্থায়ী std::function
তৈরি করা হয়, ল্যাম্বড্ডা এতে move
প্রবেশ করা হয়, তারপরে সেই অস্থায়ীটি std::function
রেফারেন্সের মধ্যে ব্যবহার করা হয় run_in_ui_thread
।
এতক্ষণ, এত ভাল - তাদের দু'জন একইরকম পারফর্ম করে। বাদে run_in_ui_thread
তার ক্রিয়াকলাপের যুক্তির একটি অনুলিপি তৈরি করতে চলেছে ইউআই থ্রেডে চালানোর জন্য! (এটি সম্পন্ন হওয়ার আগে এটি ফিরে আসবে, সুতরাং এটি কেবল এটির কোনও উল্লেখ ব্যবহার করতে পারে না)। কেস জন্য (ক), কেবলমাত্র আমরা তার দীর্ঘমেয়াদী স্টোরেজ মধ্যে। ক্ষেত্রে (খ), আমরা নকল করতে বাধ্য হয় ।move
std::function
std::function
এই স্টোরটি মান দ্বারা উত্তরণকে আরও অনুকূল করে তোলে। যদি কোনও সম্ভাবনা থাকে তবে আপনি একটি অনুলিপি সংরক্ষণ করছেন std::function
, মান দিয়ে পাস করুন। অন্যথায়, যে কোনও উপায়ে মোটামুটি সমতুল্য: বাই-ভ্যালুর একমাত্র নেতিবাচকতা হ'ল যদি আপনি একই ভারী ভারী গ্রহণ করে থাকেন std::function
এবং একের পর এক উপ-পদ্ধতি ব্যবহার করেন। তা বাদ দিলে একটি ক move
হিসাবে দক্ষ হবে const&
।
এখন, দু'জনের মধ্যে আরও কিছু পার্থক্য রয়েছে যা বেশিরভাগ ক্ষেত্রে কিক হয় যদি আমাদের মধ্যে স্থির অবস্থা থাকে std::function
।
ধরে নিন যে স্টোরগুলিতে std::function
একটি কিছু দিয়ে কিছু বস্তু রয়েছে operator() const
তবে এতে কিছু mutable
ডেটা সদস্য রয়েছে যা এটি সংশোধন করে (কতটা অভদ্র!)।
ইন std::function<> const&
মামলা, mutable
সংশোধিত যেটা সদস্যদের ফাংশন কল আউট সঞ্চারিত হবে। ইন std::function<>
মামলা, তারা না হয়।
এটি তুলনামূলকভাবে অদ্ভুত কোণার কেস।
আপনি std::function
অন্য কোনও সম্ভাব্য ভারী ওজন, সস্তায় চলমান প্রকারের মতো আচরণ করতে চান । চলাচল সস্তা, অনুলিপি ব্যয়বহুল হতে পারে।
sizeof(std::function)
চেয়ে বেশি আর কিছু হবে না বলে আশা করব2 * sizeof(size_t)
, যা আপনি কোনও দৃ const় রেফারেন্সের জন্য বিবেচনা করবেন এমন ন্যূনতম আকার।