টিএল; ডিআর: কনস রেফারেন্স রেফারেন্সটি সি ++ এ এখনও বিবেচনা করা সমস্ত বিষয় good অকাল অপটিমাইজেশন নয়।
টিএল; ডিআর 2: বেশিরভাগ অভ্যাসগুলি সেগুলি না করা পর্যন্ত তা বোঝায় না they
লক্ষ্য
এই উত্তরটি লিঙ্কযুক্ত আইটেমটি কেবল প্রসারিত করার চেষ্টা করে সি ++ কোর গাইডলাইনে (প্রথমে আমনের মন্তব্যে উল্লিখিত) কিছুটা ।
এই উত্তরটি প্রোগ্রামারদের চেনাশোনাগুলিতে বিস্তৃতভাবে প্রচারিত বিভিন্ন প্রবাদ বিশেষত বিরোধী সিদ্ধান্ত বা প্রমাণের মধ্যে পুনর্মিলনের বিষয়টি যেভাবে বিবেচনা এবং সঠিকভাবে প্রয়োগ করতে হবে তার ইস্যুটি সমাধান করার চেষ্টা করে না।
প্রযোজ্যতা
এই উত্তরটি ফাংশন কলগুলিতে (একই থ্রেডে অ-বিচ্ছিন্ন নেস্টেড স্কোপগুলি) প্রযোজ্য।
(পার্শ্ব নোট।) যখন প্যাসেবল জিনিসগুলি সুযোগ থেকে বাঁচতে পারে (অর্থাত্ আজীবন তার সম্ভাব্য বাহ্যিক ক্ষেত্রের চেয়ে বেশি হয়ে থাকে), অন্য কোনও কিছুর আগে অ্যাপ্লিকেশনটির প্রয়োজনের জন্য প্রয়োজনীয় জীবনযাপন মেটানো আরও গুরুত্বপূর্ণ হয়ে ওঠে। সাধারণত, এর জন্য উল্লেখগুলি ব্যবহার করা দরকার যা স্মার্ট পয়েন্টারগুলির মতো আজীবন পরিচালনার ক্ষেত্রেও সক্ষম। কোনও বিকল্প হয়ত কোনও ম্যানেজার ব্যবহার করছে। মনে রাখবেন, ল্যাম্বদা এক প্রকারের বিচ্ছিন্ন সুযোগ; ল্যাম্বদা ক্যাপচারগুলি অবজেক্ট স্কোপ থাকার মতো আচরণ করে। অতএব, ল্যাম্বদা ক্যাপচারগুলি সম্পর্কে সতর্কতা অবলম্বন করুন। লাম্বদা নিজেই কীভাবে পাস হয় সে সম্পর্কে সতর্কতা অবলম্বন করুন - অনুলিপি বা রেফারেন্সের মাধ্যমে।
কখন মান দিয়ে পাস করবেন
মান হিসাবে স্কেলার (মেশিনের নিবন্ধের মধ্যে মানসম্পন্ন আদিম মান এবং মূল্যবান শব্দার্থক) রয়েছে তার জন্য, যার দ্বারা যোগাযোগ দ্বারা বাই মিউটিবিলিটি (ভাগ হওয়া রেফারেন্স) প্রয়োজন হয় না, মান দিয়ে পাস করুন।
যে পরিস্থিতিতে ক্যালির জন্য কোনও সামগ্রীর ক্লোনিং বা সমষ্টি প্রয়োজন, মান অনুসারে পাস করুন, যেখানে কলির অনুলিপি ক্লোনযুক্ত বস্তুর প্রয়োজনীয়তা পূরণ করে।
রেফারেন্স ইত্যাদির মাধ্যমে কখন পাস করবেন
অন্যান্য সমস্ত পরিস্থিতিতে, পয়েন্টার, রেফারেন্স, স্মার্ট পয়েন্টার, হ্যান্ডলগুলি (দেখুন: হ্যান্ডেল-বডি আইডিয়াম) ইত্যাদির সাহায্যে পাস করুন followed
মেমরি পদচিহ্নগুলিতে পর্যাপ্ত পরিমাণে যে জিনিসগুলি (সমষ্টি, অবজেক্টস, অ্যারে, ডেটা স্ট্রাকচার) সর্বদা পারফরম্যান্সের কারণে পাস-বাই-রেফারেন্সকে সহজতর করার জন্য ডিজাইন করা উচিত। শত শত বাইট বা তার বেশি হলে এই পরামর্শ অবশ্যই প্রয়োগ হয় or এই পরামর্শটি যখন দশক বাইট হয় তখন সীমান্তরেখা হয়।
অস্বাভাবিক দৃষ্টান্ত
বিশেষ উদ্দেশ্যে প্রোগ্রামিং দৃষ্টান্ত রয়েছে যা অভিপ্রায় অনুসারে কপি-ভারী। উদাহরণস্বরূপ, স্ট্রিং প্রসেসিং, সিরিয়ালাইজেশন, নেটওয়ার্ক যোগাযোগ, বিচ্ছিন্নতা, তৃতীয় পক্ষের লাইব্রেরি মোড়ানো, ভাগ করা-মেমরি আন্তঃ প্রক্রিয়া যোগাযোগ ইত্যাদি এই অ্যাপ্লিকেশন ক্ষেত্রগুলিতে বা প্রোগ্রামিং প্যারাডিমগুলিতে, স্ট্রাক্ট থেকে স্ট্রাক্টে ডেটা অনুলিপি করা হয়, বা কখনও কখনও আবার পুনরায় বিতরণ করা হয় বাইট অ্যারে।
ভাষার স্পেসিফিকেশন কীভাবে এই উত্তরটিকে আগে প্রভাবিত করেঅপ্টিমাইজেশান বিবেচনা করার ।
উপ-টি এল; ডিআর একটি রেফারেন্স প্রচার করে কোনও কোড নেওয়া উচিত নয়; কনস্ট্যান্ড-রেফারেন্স দিয়ে পাস করা এই মানদণ্ডকে সন্তুষ্ট করে। তবে অন্যান্য সমস্ত ভাষা অনন্যভাবে এই মানদণ্ডকে মেটায়।
(নোভিস সি ++ প্রোগ্রামারদের এই বিভাগটি পুরোপুরি এড়িয়ে যাওয়ার পরামর্শ দেওয়া হয়েছে))
(এই বিভাগের শুরু আংশিকভাবে gnasher729 এর উত্তর দ্বারা অনুপ্রাণিত। তবে, একটি পৃথক সিদ্ধান্তে পৌঁছেছে))
সি ++ ব্যবহারকারীর দ্বারা সংজ্ঞায়িত অনুলিপি নির্মাণকারী এবং অ্যাসাইনমেন্ট অপারেটরগুলিকে অনুমতি দেয়।
(এটি ছিল একটি সাহসী পছন্দ যা (উভয়ই আশ্চর্যজনক এবং আফসোসযোগ্য language এটি ভাষা নকশার ক্ষেত্রে অবশ্যই আজকের গ্রহণযোগ্য আদর্শের থেকে পৃথক)))
এমনকি যদি সি ++ প্রোগ্রামার এক সংজ্ঞায়িত নয়, সি ++ কম্পাইলার ভাষা নীতির ভিত্তিতে ধরনের পদ্ধতি উৎপন্ন করা আবশ্যক, এবং তারপর তা নির্ধারণ অতিরিক্ত কোড চাহিদা ছাড়া অন্য নিষ্পন্ন করা হবে memcpy
। উদাহরণস্বরূপ, একজন class
/ struct
যার std::vector
সদস্য রয়েছে তার একটি অনুলিপিযুক্ত একটি অনুলিপি-নির্মাণকারী এবং একটি অ্যাসাইনমেন্ট অপারেটর থাকতে হবে।
অন্যান্য ভাষায়, অনুলিপি নির্মাণকারী এবং অবজেক্ট ক্লোনিংকে নিরুৎসাহিত করা হয় (যেখানে একেবারে প্রয়োজনীয় এবং / অথবা অ্যাপ্লিকেশনটির শব্দার্থবিজ্ঞানের অর্থবোধক ব্যতীত), কারণ ভাষার নকশায় বস্তুর রেফারেন্স শব্দার্থিক শব্দ রয়েছে। এই ভাষাগুলিতে সাধারণত আবর্জনা সংগ্রহের প্রক্রিয়া থাকবে যা স্কোপ-ভিত্তিক মালিকানা বা রেফারেন্স-গণনার পরিবর্তে পুনরায় ব্যবহারযোগ্যতার উপর ভিত্তি করে।
যখন কোনও রেফারেন্স বা পয়েন্টার (কনস্ট রেফারেন্স সহ) সি ++ (বা সি) এর চারপাশে পাস করা হয় তখন প্রোগ্রামারকে আশ্বাস দেওয়া হয় যে ঠিকানা মানটির প্রচার ব্যতীত কোনও বিশেষ কোড (ব্যবহারকারী-সংজ্ঞায়িত বা সংকলক-উত্পাদিত ফাংশন) কার্যকর করা হবে না (রেফারেন্স বা পয়েন্টার)। এটি এমন আচরণের স্পষ্টতা যা সি ++ প্রোগ্রামাররা স্বাচ্ছন্দ্য বোধ করে।
তবে, পটভূমিটি হ'ল সি ++ ভাষা অহেতুক জটিল, যেমন আচরণের এই স্পষ্টতা একটি পারমাণবিক পতন অঞ্চলটির আশেপাশে কোথাও মরুদ্যান (একটি বেঁচে থাকার আবাস) এর মতো।
আরও আশীর্বাদ যুক্ত করতে (বা অবমাননা), ভাল পারফরম্যান্স সহ ব্যবহারকারী-সংজ্ঞায়িত মুভ অপারেটরদের (মুভ-কনস্ট্রাক্টর এবং মুভ-এসাইনমেন্ট অপারেটর) সুবিধার্থে সি ++ সর্বজনীন রেফারেন্স (আর-মান) প্রবর্তন করে। এটি অনুলিপি এবং ডিপ-ক্লোনিংয়ের প্রয়োজনীয়তা হ্রাস করার মাধ্যমে একটি অত্যন্ত প্রাসঙ্গিক ব্যবহারের ক্ষেত্রে (একটি উদাহরণ থেকে অন্য ক্ষেত্রে অবজেক্টগুলির স্থানান্তর (স্থানান্তর)) উপকার করে। তবে অন্যান্য ভাষায় এই জাতীয় পদার্থের চলন সম্পর্কে কথা বলা অযৌক্তিক।
(অফ-টপিক বিভাগ) একটি নিবন্ধ নিবেদিত, "গতি চান? মূল্য দিয়ে পাস করুন!" প্রায় ২০০৯ সালে লিখিত
এই নিবন্ধটি ২০০৯ সালে লেখা হয়েছিল এবং সি ++ এ আর-মানের জন্য নকশার ন্যায্যতা ব্যাখ্যা করে। এই নিবন্ধটি পূর্ববর্তী বিভাগে আমার উপসংহারে একটি বৈধ পাল্টা যুক্তি উপস্থাপন করে। যাইহোক, নিবন্ধটির কোড উদাহরণ এবং কার্য সম্পাদনের দাবি দীর্ঘদিন ধরে খণ্ডন করা হয়েছে।
সাব-টিএল; ডিআর সি ++ এ আর-ভ্যালু শব্দার্থবিজ্ঞানের নকশাটি একটিতে আশ্চর্যজনকভাবে মার্জিত ব্যবহারকারী-পক্ষের শব্দার্থবিজ্ঞানের অনুমতি দেয়Sort
উদাহরণস্বরূপ ফাংশনে । এই মার্জিতটি অন্য ভাষায় মডেল (অনুকরণ) করা অসম্ভব।
একটি সম্পূর্ণ ডাটা স্ট্রাকচারে একটি সাজানো ফাংশন প্রয়োগ করা হয়। উপরে উল্লিখিত হিসাবে, অনেক অনুলিপি জড়িত থাকলে এটি ধীর হবে। পারফরম্যান্স অপটিমাইজেশন হিসাবে (এটি ব্যবহারিকভাবে প্রাসঙ্গিক), সি ++ ব্যতীত কয়েকটি কয়েকটি ভাষায় একটি বাছাই করা ফাংশনটি ধ্বংসাত্মক হওয়ার জন্য ডিজাইন করা হয়েছে। ধ্বংসাত্মক মানে হ'ল বাছাই করা লক্ষ্য অর্জনের জন্য লক্ষ্য ডেটা কাঠামোটি সংশোধিত হয়।
সি ++ এ ব্যবহারকারী দুটি প্রয়োগের মধ্যে একটিতে কল করতে পারেন: উন্নত পারফরম্যান্স সহ একটি ধ্বংসাত্মক, বা একটি সাধারণ যা ইনপুট পরিবর্তন করে না। (টেমপ্লেটটি বংশবৃদ্ধির জন্য বাদ দেওয়া হয়েছে))
/*caller specifically passes in input argument destructively*/
std::vector<T> my_sort(std::vector<T>&& input)
{
std::vector<T> result(std::move(input)); /* destructive move */
std::sort(result.begin(), result.end()); /* in-place sorting */
return result; /* return-value optimization (RVO) */
}
/*caller specifically passes in read-only argument*/
std::vector<T> my_sort(const std::vector<T>& input)
{
/* reuse destructive implementation by letting it work on a clone. */
/* Several things involved; e.g. expiring temporaries as r-value */
/* return-value optimization, etc. */
return my_sort(std::vector<T>(input));
}
/*caller can select which to call, by selecting r-value*/
std::vector<T> v1 = {...};
std::vector<T> v2 = my_sort(v1); /*non-destructive*/
std::vector<T> v3 = my_sort(std::move(v1)); /*v1 is gutted*/
বাছাই করা বাদে, এই কমনীয়তা পুনরাবৃত্তির বিভাজন দ্বারা অ্যারে (প্রাথমিকভাবে সাজানো না হওয়া) মধ্যে ধ্বংসাত্মক মিডিয়ান সন্ধানকারী অ্যালগরিদম বাস্তবায়নেও কার্যকর।
তবে নোট করুন যে বেশিরভাগ ভাষাগুলি অ্যারেগুলিতে একটি ধ্বংসাত্মক বাছাইকরণ অ্যালগরিদম প্রয়োগ না করে বাছাইয়ের জন্য একটি ভারসাম্য বাইনারি অনুসন্ধান ট্রি পদ্ধতির প্রয়োগ করবে। সুতরাং, এই কৌশলটির ব্যবহারিক প্রাসঙ্গিকতা যতটা মনে হয় তত বেশি নয়।
সংকলক অপ্টিমাইজেশন কিভাবে এই উত্তর প্রভাবিত করে
যখন ইনলাইনিং (এবং পুরো প্রোগ্রাম অপটিমাইজেশন / লিংক-টাইম অপ্টিমাইজেশান) ফাংশন কলগুলির বিভিন্ন স্তরের জুড়ে প্রয়োগ করা হয়, তখন সংকলক ডেটার প্রবাহটি দেখতে (কখনও কখনও বহিরাগতভাবে) দেখতে সক্ষম হয়। যখন এটি ঘটে, সংকলক অনেকগুলি অপ্টিমাইজেশান প্রয়োগ করতে পারে, যার মধ্যে কিছু স্মৃতিতে পুরো বস্তুগুলির সৃষ্টিকে বাদ দিতে পারে। সাধারণত, যখন এই পরিস্থিতি প্রযোজ্য হয়, পরামিতিগুলি মান দ্বারা বা কনস্ট্যান্স-রেফারেন্স দ্বারা পাস করা উচিত নয়, কারণ সংকলক বিশদভাবে বিশ্লেষণ করতে পারে।
তবে, যদি নিম্ন স্তরের ফাংশনটি এমন কিছু কল করে যা বিশ্লেষণের বাইরে (যেমন সংকলনের বাইরের কোনও পৃথক গ্রন্থাগারের কিছু, বা কলগ্রাফ যা কেবল খুব জটিল), তবে সংকলকটিকে অবশ্যই ডিফেন্সিয়ালি অপ্টিমাইজ করতে হবে।
একটি মেশিন রেজিস্টার মানের চেয়ে বড় অবজেক্টগুলি স্পষ্টভাবে মেমরি লোড / স্টোর নির্দেশাবলী দ্বারা, বা সম্মানজনক memcpy
ফাংশনে একটি কল দ্বারা অনুলিপি করা যেতে পারে । কিছু প্ল্যাটফর্মে, সংকলক দুটি মেমরি অবস্থানের মধ্যে সরে যাওয়ার জন্য সিমডি নির্দেশাবলী উত্পন্ন করে, প্রতিটি নির্দেশ দশ বাইট (16 বা 32) চলন্ত।
ভার্বোসিটি বা ভিজ্যুয়াল গন্ডগোলের বিষয়টি নিয়ে আলোচনা
সি ++ প্রোগ্রামার এটির সাথে অভ্যস্ত, অর্থাত্ প্রোগ্রামার যতক্ষণ C ++ ঘৃণা করে না, সোর্স কোডে কনস্ট-রেফারেন্স লেখার বা পড়ার ওভারহেড ভয়ঙ্কর নয়।
ব্যয়-বেনিফিট বিশ্লেষণগুলি এর আগেও অনেকবার করা হতে পারে। আমি জানি না যে এমন কোনও বৈজ্ঞানিক বিষয় রয়েছে যা উদ্ধৃত করা উচিত। আমার ধারণা বেশিরভাগ বিশ্লেষণগুলি অ বৈজ্ঞানিক বা অ পুনঃপ্রজননযোগ্য হবে।
আমি যা কল্পনা করি (প্রমাণ বা বিশ্বাসযোগ্য উল্লেখ ছাড়াই) এখানে ...
- হ্যাঁ, এটি এই ভাষায় লেখা সফ্টওয়্যারটির কার্যকারিতাকে প্রভাবিত করে।
- সংকলকগণ যদি কোডের উদ্দেশ্য বুঝতে পারে তবে এটি স্বয়ংক্রিয়ভাবে চালানোর পক্ষে এটি যথেষ্ট স্মার্ট হতে পারে
- দুর্ভাগ্যক্রমে, যে ভাষাগুলিতে পরিবর্তনীয়তার পক্ষে (ক্রিয়ামূলক বিশুদ্ধতার বিপরীতে), সংকলক বেশিরভাগ জিনিসকে রূপান্তরিত হিসাবে শ্রেণিবদ্ধ করবে, সুতরাং স্থিরতার স্বয়ংক্রিয়ভাবে কর্তন বেশিরভাগ জিনিসকে অ-কনস্ট্যান্ট হিসাবে প্রত্যাখ্যান করবে
- মানসিক ওভারহেড মানুষের উপর নির্ভর করে; যে লোকেরা এটিকে উচ্চ মানসিক ওভারহেড বলে মনে করে তারা সি ++ কে একটি व्यवहार्य প্রোগ্রামিং ভাষা হিসাবে প্রত্যাখ্যান করে।