সংকলক অপ্টিমাইজেশনের উপর নির্ভর করে এমন কোড লেখা কি অনুশীলন?


99

আমি কিছু সি ++ শিখছি, এবং প্রায়শই ফাংশনের মধ্যে তৈরি ফাংশনগুলি থেকে বড় অবজেক্টগুলি ফিরে আসতে হয়। আমি জানি রেফারেন্স অনুসারে পাস আছে, একটি পয়েন্টার ফিরিয়ে দেওয়া হয়েছে, এবং একটি রেফারেন্স ধরণের সমাধানগুলি ফিরে আসবে, তবে আমি আরও পড়েছি যে সি ++ সংকলকগুলি (এবং সি ++ স্ট্যান্ডার্ড) রিটার্ন মান অপ্টিমাইজেশনের জন্য মঞ্জুরি দেয় যা মেমরির মাধ্যমে এই বৃহত অবজেক্টগুলি অনুলিপি করে এড়িয়ে যায় which সব কিছুর সময় এবং স্মৃতি সাশ্রয়।

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

এটি কি কোনও মাইক্রো-অপ্টিমাইজেশন, বা আমার কোডটি ডিজাইনের সময় আমার মনে রাখা উচিত?


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

4
@ ওয়ালফ্র্যাট এমনকি যদি মেগাবাইটের ক্রমে অবজেক্টগুলি বেশ বড় হয়? আমি যে সমস্যাগুলি সমাধান করছি তার প্রকৃতির কারণে আমার অ্যারেগুলি বিশাল আকার ধারণ করতে পারে।
ম্যাট

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

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

37
ইন নির্দিষ্ট ক্ষেত্রে এর সি ++ এর (এন) RVO, হ্যাঁ, এই অপ্টিমাইজেশান উপর নির্ভর পুরোপুরি বৈধ। এটি কারণ সি ++ 17 স্ট্যান্ডার্ড নির্দিষ্টভাবে আদেশ দেয় যে এটি ঘটে, আধুনিক সংকলকরা ইতিমধ্যে এটি করছে।
কালেথ

উত্তর:


130

চাকরী বিস্ময়ের ন্যূনতম নীতি

আপনি কি কেবল এবং কেবল আপনিই এই কোডটি ব্যবহার করতে যাচ্ছেন এবং আপনি কি নিশ্চিত যে আপনি 3 বছরের মধ্যে একইরূপে আপনি যা করছেন তা অবাক করে যাবেন না?

তারপর এগিয়ে যান।

অন্যান্য সমস্ত ক্ষেত্রে, স্ট্যান্ডার্ড উপায় ব্যবহার করুন; অন্যথায়, আপনি এবং আপনার সহকর্মীরা বাগগুলি খুঁজে পেতে খুব কঠোরভাবে চলতে চলেছেন।

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


88
@ নীল এটাই আমার বক্তব্য, প্রত্যেকে শর্ট সার্কিট মূল্যায়নের উপর নির্ভর করে। এবং আপনার এটি নিয়ে দুবার ভাবতে হবে না, এটি চালু করা উচিত। এটি একটি Defacto মান। হ্যাঁ আপনি এটি পরিবর্তন করতে পারেন, তবে আপনার উচিত হবে না।
পিটার বি

49
"ভাষাটি কীভাবে কাজ করে তা আমি বদলেছি এবং আপনার নোংরা পচা কোডটি ভেঙে গেছে! আরঘ!" কি দারুন. চড় মারা উপযুক্ত হবে, আপনার সহকর্মীকে জেন প্রশিক্ষণে প্রেরণ করুন, সেখানে প্রচুর পরিমাণ রয়েছে।

109
@ পিটারবি আমি নিশ্চিত যে সি এবং সি ++ ভাষার স্পেস শর্ট সার্কিটের মূল্যায়নের গ্যারান্টি দেয়। তাই এটি শুধু একটি স্বতন্ত্র মান হিসেবেই নয়, এটা মান। এটি ছাড়া আপনি এমনকি সি / সি ++ ব্যবহার করছেন না, তবে সন্দেহজনকভাবে এটির মতো কিছু: পি
মার্সেলেম

47
কেবলমাত্র রেফারেন্সের জন্য, মানকটি এখানে মান দ্বারা প্রত্যাবর্তন।
ডেড এমএমজি

28
@ dan04 হ্যাঁ এটি ডেলফিতে ছিল। ছেলেরা, আমি যে দৃষ্টিকোণটি করেছি তার উদাহরণটি ধরা পড়বেন না। আর কেউ অবাক করে না এমন অবাক করে দেবেন না।
পিটার বি

81

এই বিশেষ ক্ষেত্রে, অবশ্যই মান দ্বারা প্রত্যাবর্তন।

  • আরভিও এবং এনআরভিও সুপরিচিত এবং শক্তিশালী অপ্টিমাইজেশান যা সত্যই যে কোনও শালীন সংকলক দ্বারা তৈরি করা উচিত, এমনকি সি ++ 03 মোডেও।

  • সরানো শব্দার্থবিজ্ঞানগুলি নিশ্চিত করে যে (এন) আরভিও না হয়ে থাকলে বস্তুগুলি ফাংশন থেকে সরিয়ে নেওয়া হয়েছে। এটি কেবল তখনই কার্যকর যদি আপনার অবজেক্টটি অভ্যন্তরীণভাবে ডায়নামিক ডেটা ব্যবহার std::vectorকরে (যেমন করে) তবে এটি যদি এমন হয় তবে সত্যই এটি হওয়া উচিত big স্ট্যাককে উপচে পড়া বড় স্বয়ংক্রিয় বস্তুর সাথে ঝুঁকিপূর্ণ।

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

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

কেবল কোডটি লিখুন যা বোধগম্য হয় এবং সংকলক লেখকদের ধন্যবাদ যাতে সঠিকভাবে সংবেদনশীল কোডটি অনুকূল হয় for


9
কেবল মজাদার জন্য দেখুন 1990-ইশ থেকে বোরল্যান্ড টার্বো সি ++ 3.0 কীভাবে আরভিও পরিচালনা করে । Spoiler: এটি মূলত ঠিক কাজ করে।
nwp

9
এখানে মূল কথাটি হ'ল এটি কোনও র্যান্ডম সংকলক-নির্দিষ্ট অপ্টিমাইজেশন বা "অননুমোদিত বৈশিষ্ট্য" নয়, তবে এমন কিছু যা প্রযুক্তিগতভাবে সি ++ স্ট্যান্ডার্ডের বেশ কয়েকটি সংস্করণে alচ্ছিকভাবে শিল্পের দ্বারা প্রচণ্ডভাবে চাপানো হয়েছিল এবং প্রতিটি বড় সংকলক এটির জন্য যথেষ্ট কাজ করেছে for একটি খুব দীর্ঘ সময়.

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

62

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

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

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

আপনার এই অপ্টিমাইজেশনের উপর একেবারে নির্ভর করা উচিত।

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


3
ধন্যবাদ, এটি অনেক অর্থবোধ করে এবং উপরে বর্ণিত "সর্বনিম্ন বিস্মিত নীতি" এর সাথে সামঞ্জস্যপূর্ণ। এটি কোডটিকে খুব স্পষ্ট এবং বোধগম্য করে তুলবে এবং পয়েন্টার শেননিগানদের সাথে জগাখিচুতা করা শক্ত করে তোলে।
ম্যাট

3
@ ম্যাট যে কারণে আমি এই উত্তরটিকে অগ্রাহ্য করেছি তার একটি অংশ এটিতে "মান শব্দার্থবিজ্ঞানের" উল্লেখ নেই। আপনি যখন সি ++ (এবং সাধারণভাবে প্রোগ্রামিং) এর আরও অভিজ্ঞতা পান, আপনি মাঝে মধ্যে এমন পরিস্থিতি দেখতে পাবেন যেখানে মান শব্দার্থবিজ্ঞান নির্দিষ্ট বস্তুর জন্য ব্যবহার করা যায় না কারণ সেগুলি পরিবর্তনযোগ্য এবং তাদের পরিবর্তনগুলি একই কোড ব্যবহার করে এমন অন্যান্য কোডের জন্য দৃশ্যমান করা প্রয়োজন (একটি "ভাগ করা পরিবর্তন" এর উদাহরণ)। যখন এই পরিস্থিতিগুলি ঘটে তখন প্রভাবিত বস্তুগুলিকে (স্মার্ট) পয়েন্টারগুলির মাধ্যমে ভাগ করে নেওয়া দরকার।
রওয়ং

16

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

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

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

আমার নিজের অনুশীলনে এর সর্বোত্তম উদাহরণটি হ'ল লেজ কল অপ্টিমাইজেশন:

   int sillyAdd(int a, int b)
   {
      if (b == 0)
          return a;
      return sillyAdd(a + 1, b - 1);
   }

এটি একটি নির্বোধ উদাহরণ, তবে এটি একটি লেজ কল দেখায়, যেখানে কোনও ফাংশন শেষে ফাংশনটির শেষে ডানদিকে পুনরাবৃত্তভাবে ডাকা হয়। সি ++ ভার্চুয়াল মেশিনটি দেখিয়ে দেবে যে এই কোডটি সঠিকভাবে পরিচালিত হচ্ছে, যদিও আমি প্রথমে কেন এমন একটি অতিরিক্ত রুটিন লিখতে কেন বিরক্ত করেছি তা নিয়ে আমি একটু বিভ্রান্তি সৃষ্টি করতে পারি । তবে, সি ++ এর ব্যবহারিক বাস্তবায়নে আমাদের একটি স্ট্যাক রয়েছে এবং এর সীমিত জায়গা রয়েছে। পেডেন্টালিভাবে করা হয়ে গেলে, এই ক্রিয়াকলাপটি কমপক্ষে b + 1স্ট্যাক ফ্রেমগুলিকে স্ট্যাকের সাথে যুক্ত করতে হবে কারণ এটি এর সংযোজন করে। আমি যদি গণনা করতে চাই sillyAdd(5, 7)তবে এটি কোনও বড় বিষয় নয়। আমি যদি গণনা করতে চাই তবে আমি sillyAdd(0, 1000000000)স্ট্যাকওভারফ্লো (এবং ভাল ধরণের নয় ) সৃষ্টিতে প্রকৃত সমস্যায় পড়তে পারি ।

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

   int sillyAdd(int a, int b)
   {
      begin:
      if (b == 0)
          return a;
      // return sillyAdd(a + 1, b - 1);
      a = a + 1;
      b = b - 1;
      goto begin;  
   }

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

সুতরাং আমার পক্ষে গণনা করতে সক্ষম হওয়ার উপর নির্ভর করা খারাপ হবে sillyAdd(0, 1000000000)


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

5
@ এসডেনহ্যাম আমার ধারণা, যুক্তিটিতে কিছুটা জায়গা আছে। যদি আপনি আর "সি ++" লেখেন না, বরং "উইন্ড্রাইভার সি ++ সংকলক সংস্করণ 3.4.1," এর জন্য লিখছেন তবে আমি সেখানে যুক্তিটি দেখতে পাচ্ছি। তবে, একটি সাধারণ নিয়ম হিসাবে, আপনি যদি এমন কিছু লিখে থাকেন যা অনুমান অনুযায়ী সঠিকভাবে কাজ করে না, আপনি খুব ভিন্ন ধরণের দৃশ্যে রয়েছেন। আমি জানি বুস্ট লাইব্রেরিতে এর মতো কোড রয়েছে তবে তারা সর্বদা এটি #ifdefব্লক করে রাখে এবং মানক মানানসই কাজের ব্যবস্থা উপলব্ধ।
আম্মন

4
এটি কোডের দ্বিতীয় ব্লকের একটি টাইপো যেখানে এটি বলে b = b + 1?
স্টিপ করুন

2
আপনি একটি "সি ++ ভার্চুয়াল মেশিন" বলতে কী বোঝাতে চাইছেন তা ব্যাখ্যা করতে চাইতে পারেন, কারণ এটি কোনও মানক নথিতে ব্যবহৃত শব্দ নয়। আমি মনে করি আপনি সি ++ এর এক্সিকিউশন মডেলের কথা বলছেন, তবে সম্পূর্ণ নিশ্চিত নয় - এবং আপনার শব্দটি "বিটেকোড ভার্চুয়াল মেশিন" এর সাথে প্রতারণামূলকভাবে অনুরূপ, যা সম্পূর্ণ ভিন্নর সাথে সম্পর্কিত।
টবি স্পিড

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

8

অনুশীলনে সি ++ প্রোগ্রামগুলি কিছু সংকলক অপ্টিমাইজেশন আশা করে।

উল্লেখযোগ্যভাবে আপনার স্ট্যান্ডার্ড পাত্রে বাস্তবায়নের মানক শিরোনামগুলি দেখুন । সঙ্গে জিসিসি , আপনি preprocessed ফর্ম (এটা জন্য কি দিতে g++ -C -E) এবং GIMPLE অভ্যন্তরীণ উপস্থাপনা ( g++ -fdump-tree-gimpleবা Gimple এসএসএ সঙ্গে -fdump-tree-ssaসবচেয়ে উৎস ফাইল) (টেকনিক্যালি অনুবাদ একক) পাত্রে ব্যবহার করে। আপনি যে পরিমাণ অপটিমাইজেশন করেছেন তার দ্বারা অবাক হয়ে যাবেন (দিয়ে g++ -O2)। সুতরাং ধারকগুলির প্রয়োগকারীরা অপ্টিমাইজেশানগুলির উপর নির্ভর করে (এবং বেশিরভাগ সময়, একটি সি ++ স্ট্যান্ডার্ড লাইব্রেরির প্রয়োগকারী জানে যে অপ্টিমাইজেশনটি ঘটবে এবং মনের সাথে ধারক প্রয়োগটি লিখবেন; কখনও কখনও তিনি সংকলকটিতে অপ্টিমাইজেশন পাসটিও লিখতেন) তত্ক্ষেত্রে স্ট্যান্ডার্ড সি ++ লাইব্রেরি দ্বারা প্রয়োজনীয় বৈশিষ্ট্যগুলি নিয়ে কাজ করুন)।

অনুশীলনে, এটি সংকলক অনুকূলিতকরণ যা সি ++ এবং এর স্ট্যান্ডার্ড পাত্রে যথেষ্ট দক্ষ করে তোলে। সুতরাং আপনি তাদের উপর নির্ভর করতে পারেন।

এবং অনুরূপভাবে আপনার প্রশ্নে উল্লিখিত আরভিও মামলার জন্য।

সি ++ স্ট্যান্ডার্ডটি সম্ভাব্য অপটিমাইজেশনগুলির সাথে ভালভাবে কাজ করার জন্য সহ-নকশা করা হয়েছিল (নতুন বৈশিষ্ট্যগুলির প্রস্তাব দেওয়ার সময় যথেষ্ট ভাল অপ্টিমাইজেশন পরীক্ষা করে)।

উদাহরণস্বরূপ, নীচের প্রোগ্রামটি বিবেচনা করুন:

#include <algorithm>
#include <vector>

extern "C" bool all_positive(const std::vector<int>& v) {
  return std::all_of(v.begin(), v.end(), [](int x){return x >0;});
}

সঙ্গে এটি কম্পাইল g++ -O3 -fverbose-asm -S। আপনি খুঁজে পাবেন যে উত্পন্ন ফাংশন কোনও CALLমেশিনের নির্দেশনা চালায় না । সুতরাং বেশিরভাগ সি ++ পদক্ষেপ (একটি ল্যাম্বডা বন্ধের নির্মাণ, এর পুনরাবৃত্তি প্রয়োগ, beginএবং পুনরায় endপুনরুদ্ধারকারী ইত্যাদি পাওয়া ইত্যাদি) অনুকূলিত করা হয়েছে। মেশিন কোডে কেবল একটি লুপ থাকে (যা উত্স কোডে স্পষ্টভাবে উপস্থিত হয় না)। এই ধরনের অপ্টিমাইজেশন ছাড়া, সি ++ 11 সফল হবে না।

addenda

(যোগ ডিসেম্বর 31 2017)

সিপিসকন 2017 দেখুন : ম্যাট গডবোল্ট “আমার কম্পাইলার ইদানীং আমার জন্য কী করেছে? সংকলকের idাকনাটি আনবোল্ট করা হচ্ছে talk


4

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

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

সংকলকরা দক্ষ আউটপুট উত্পাদন করতে প্রচুর প্রচেষ্টা করা হয়, এবং স্পষ্টভাবে উদ্দেশ্যগুলি সেই ক্ষমতাগুলি ব্যবহার করা হয়।

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


3

আমি মনে করি অন্যরা সি ++ এবং আরভিও সম্পর্কে নির্দিষ্ট কোণটি ভালভাবে কভার করেছে। এখানে আরও সাধারণ উত্তর দেওয়া হল:

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

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


1

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

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

যদি একটি সংকলক অপ্টিমাইজেশনের ফলে বিভিন্ন ফলাফল হয়, তবে এটি বাগ - সংকলকটিতে একটি বাগ। সংকলকটিতে একটি বাগের উপর নির্ভর করা দীর্ঘমেয়াদে একটি ভুল - এটি ঠিক হয়ে গেলে কী হয়?

সংকলক পতাকা ব্যবহার করে যা গণনাগুলি কীভাবে কাজ করে তা ডকুমেন্টেড হওয়া উচিত, তবে প্রয়োজনীয় হিসাবে ব্যবহৃত হয়।


দুর্ভাগ্যক্রমে, প্রচুর সংকলক ডকুমেন্টেশন বিভিন্ন মোডে কি বা গ্যারান্টিযুক্ত তা নির্দিষ্ট করার একটি দুর্বল কাজ করে। তদ্ব্যতীত, "আধুনিক" সংকলক লেখকরা প্রোগ্রামারদের যে গ্যারান্টি দেয় এবং প্রয়োজন হয় না তার সংমিশ্রণগুলি সম্পর্কে তারা অসচেতন বলে মনে হয়। x*y>zওভারফ্লোর ক্ষেত্রে যদি নির্বিচারে 0 বা 1 ফল দেয় তবে কোনও প্রোগ্রাম সূক্ষ্মভাবে কাজ করবে যদি শর্ত থাকে যে এর অন্য কোনও পার্শ্ব প্রতিক্রিয়া নেই , তবে প্রয়োজন হয় কোনও প্রোগ্রামারকে অবশ্যই কোনও মূল্যে ওভারফ্লো প্রতিরোধ করতে হবে বা কম্পাইলারকে কোনও নির্দিষ্ট উপায়ে অভিব্যক্তিটি মূল্যায়ন করতে বাধ্য করা হবে
অকারণ দুর্বল

... সংকলকটি তার অবসর সময়েx*y এমন আচরণ করতে পারে যেহেতু এটির ক্রিয়াকলাপগুলি কিছু স্বেচ্ছাচারী দীর্ঘতর টাইপের ক্ষেত্রে প্রচার করে (এইভাবে উত্তোলন এবং শক্তি হ্রাসের ফর্মগুলি সরবরাহ করে যা কিছু ওভারফ্লো মামলার আচরণকে বদলে দেবে)। অনেক সংকলক অবশ্য প্রয়োজন হয় যে প্রোগ্রামাররা হয় যে কোনও মূল্যে ওভারফ্লো রোধ করে বা সংবাহকরা ওভারফ্লোয়ের ক্ষেত্রে সমস্ত মধ্যবর্তী মানগুলি ছাঁটাই করতে বাধ্য করে।
সুপারক্যাট

1

না।

সারাক্ষণ আমি এটাই করি। আমার যদি স্মৃতিতে একটি 16 টি বিট ব্লক নির্বিচারে অ্যাক্সেসের প্রয়োজন হয় তবে আমি এটি করি

void *ptr = get_pointer();
uint16_t u16;
memcpy(&u16, ptr, sizeof(u16)); // ntohs omitted for simplicity

... এবং এই সংকলনের কোডটির টুকরোটি অপ্টিমাইজ করার জন্য যা কিছু করতে পারে তার উপর নির্ভর করুন। কোডটি এআরএম, আই 386, এএমডি 64 এবং কার্যত প্রতিটি আর্কিটেকচারের বাইরে কাজ করে। তত্ত্ব অনুসারে, একটি অপ-অপ্টিমাইজ করা সংকলক আসলে কল করতে পারে memcpy, এর ফলে পুরোপুরি খারাপ পারফরম্যান্স হয়, তবে এটি আমার পক্ষে কোনও সমস্যা নয়, কারণ আমি সংকলক অপটিমাইজেশন ব্যবহার করি।

বিকল্প বিবেচনা করুন:

void *ptr = get_pointer();
uint16_t *u16ptr = ptr;
uint16_t u16;
u16 = *u16ptr;  // ntohs omitted for simplicity

এই বিকল্প কোডটি এমন কোনও মেশিনে কাজ করতে ব্যর্থ হয়েছে যেগুলির জন্য উপযুক্ত প্রান্তিককরণের প্রয়োজন হয়, যদি get_pointer()একটি অ-বিন্যস্ত পয়েন্টারটি প্রদান করে। এছাড়াও, বিকল্পে এলিয়াসিং সমস্যা থাকতে পারে।

ট্রিকটি ব্যবহার করার সময় -O2 এবং -O0 এর মধ্যে পার্থক্য memcpyদুর্দান্ত: আইপি চেকসাম পারফরম্যান্সের 67 জিপিপিএস বনাম আইপি চেকসাম পারফরম্যান্সের 3.2 জিবিপিএস। মাত্রার পার্থক্যের একটি অর্ডার!

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

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

আপনি যা-ই করেন না কেন, দয়া করে নিশ্চিত হন যে আপনার উপায়টি আসলে সংজ্ঞায়িত আচরণ নয়। অবশ্যই 16-বিট পূর্ণসংখ্যার হিসাবে মেমরির কিছু এলোমেলো ব্লক অ্যাক্সেস করা আলিয়াসিং এবং প্রান্তিককরণ সমস্যার কারণে সংজ্ঞায়িত আচরণ।


0

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

আমরা যদি মনে করি না যে আমরা আমাদের কোডটি অনুকূলকরণের জন্য আমাদের অপ্টিমাইজারের ক্ষমতার উপর নির্ভর করতে পারি, তবে আমরা সবাই সমাবেশে পারফরম্যান্স-সমালোচনামূলক বাস্তবায়নের পথে কোডিং করব।

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

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

অপ্টিমাইজারের উপর নির্ভর করার দিক থেকে ত্রুটি, ভয় নেই

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

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

প্রোফাইলিং

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


-1

সফ্টওয়্যারটি সি ++ তে খুব আলাদা প্ল্যাটফর্মে এবং প্রচুর বিভিন্ন উদ্দেশ্যে লেখা যেতে পারে।

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


-2

আমি মনে করি এর বিরক্তিকর উত্তরটি: 'এটি নির্ভর করে'।

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

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


-6

আরও কিছু না থাকলে আপনি আমাদের বলছেন না, এটি একটি খারাপ অভ্যাস, তবে আপনি প্রস্তাবিত কারণে নয়।

সম্ভবত আপনি অন্যান্য ভাষা ব্যবহার না করে আগে ব্যবহার করেছেন, সি ++ এর মধ্যে কোনও বস্তুর মান ফিরিয়ে দেওয়ার ফলে অবজেক্টের একটি অনুলিপি পাওয়া যায়। তারপরে আপনি যদি বস্তুটি সংশোধন করেন তবে আপনি একটি ভিন্ন অবজেক্টটি সংশোধন করছেন । এটি হ'ল যদি আমার কাছে থাকে Obj a; a.x=1;এবং Obj b = a;আমি তা করি b.x += 2; b.f();তবে a.xএখনও 3 এর সমান 1 নয়।

সুতরাং না, কোনও রেফারেন্স বা পয়েন্টার হিসাবে পরিবর্তিত মান হিসাবে কোনও বস্তু ব্যবহার করা একই কার্যকারিতা সরবরাহ করে না এবং আপনি আপনার সফ্টওয়্যারটিতে বাগ সহ শেষ করতে পারেন।

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

"ফাংশনটিতে একটি অবজেক্ট তৈরি করুন" এমন শব্দের মতো new Obj;যেখানে "মান দিয়ে বস্তুটি ফেরত" শোনাচ্ছেObj a; return a;

Obj a;এবং Obj* a = new Obj;খুব, খুব ভিন্ন জিনিস; প্রাক্তন সঠিকভাবে ব্যবহার না করা এবং না বুঝে স্মৃতি দুর্নীতির কারণ হতে পারে এবং সঠিকভাবে ব্যবহার না করা এবং না বোঝার পরে স্মৃতি মেমরি ফাঁস হতে পারে।


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

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

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

-7

পিটার বি কমপক্ষে বিস্মিত হওয়ার প্রস্তাব দেওয়ার ক্ষেত্রে একেবারে সঠিক।

আপনার নির্দিষ্ট প্রশ্নের উত্তর দেওয়ার জন্য, সি (+) এর এটি (সম্ভবত সম্ভবত) এর অর্থ হ'ল std::unique_ptrআপনার নির্মিত অবজেক্টে কোনও ফিরিয়ে দেওয়া উচিত ।

কারণটি হ'ল এটি একটি সি ++ বিকাশকারীদের জন্য কী চলছে তা পরিষ্কার ।

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

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


যেখানে যেমন, সেখানে তেমন.

14
এটি স্বয়ংক্রিয়ভাবে গতিশীল বরাদ্দ না করে এমন ধরণেরগুলির পক্ষে এটি উত্তম উত্তর নয়। ওপি তার ব্যবহারের ক্ষেত্রে প্রাকৃতিক জিনিসটিকে মূল্য দিয়ে প্রত্যাবর্তন করে বলে মনে করে যে তার বস্তুর কলারের দিকে স্বয়ংক্রিয় স্টোরেজ সময়কাল রয়েছে। সাধারণ, অত্যধিক-বৃহত অবজেক্টগুলির জন্য এমনকি একটি নিষ্পাপ অনুলিপি-রিটার্ন-মান বাস্তবায়ন হ'ল গতিশীল বরাদ্দের চেয়ে দ্রুতগতির অর্ডার হবে। (অন্যদিকে, যদি ফাংশনটি কোনও ধারককে ফেরত দেয়, তবে কোনও অনন্য_পয়েন্টারটি ফিরিয়ে দেওয়া মূল্য দিয়ে নির্দোষ সংকলক রিটার্নের তুলনায় সুবিধাজনক হতে পারে))
পিটার এ স্নাইডার

9
@ ম্যাট আপনি যদি বুঝতে না পারেন যে এটি সর্বোত্তম অনুশীলন নয়। অযথা মেমরি বরাদ্দ করা এবং ব্যবহারকারীদের উপর পয়েন্টার শব্দার্থক জোর করা খারাপ।
nwp

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

4
@ স্নোমান: "কখন ছিল না" এমন কিছু নেই। যদিও এটি কেবল সম্প্রতি বাধ্যতামূলক হয়ে উঠেছে , প্রতিটি সি ++ স্ট্যান্ডার্ড কখনও কখনও [এন] আরভিওকে স্বীকৃতি দিয়েছে এবং এটি সক্ষম করার জন্য থাকার ব্যবস্থা করেছে (উদাহরণস্বরূপ, সংকলকটি সর্বদা রিটার্ন ভ্যালুতে অনুলিপি নির্মাণকারীর ব্যবহার বাদ দিতে সুস্পষ্ট অনুমতি দেওয়া হয়েছে, এমনকি যদি তা এর দৃশ্যমান পার্শ্ব প্রতিক্রিয়া রয়েছে)।
জেরি কফিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.