কনটেন্ট রেফারেন্সস অকাল অপ্টিমাইজেশন হিসাবে যুক্তি কি পাস?


20

"অকালীন অপটিমাইজেশন হ'ল সমস্ত মন্দের মূল"

আমি মনে করি এটিতে আমরা সকলেই একমত হতে পারি। এবং আমি তা না করার জন্য খুব চেষ্টা করি।

তবে সম্প্রতি আমি মূল্য দ্বারা পরিবর্তে কনফারেন্স রেফারেন্স দ্বারা পরামিতিগুলি পাস করার অনুশীলন সম্পর্কে ভাবছিলাম । আমি শিখিয়েছি / শিখেছি যে নন-তুচ্ছ ফাংশন আর্গুমেন্টগুলি (অর্থাত্ বেশিরভাগ অ-আদিম ধরণের) যথাযথভাবে কনস্টের রেফারেন্স দ্বারা পাস করা উচিত - বেশ কয়েকটি বই যেটি আমি পড়েছি এটি একটি "সেরা অনুশীলন" হিসাবে সুপারিশ করে।

তবুও আমি সাহায্য করতে পারি না কিন্তু আশ্চর্য হতে পারি: আধুনিক সংকলক এবং নতুন ভাষার বৈশিষ্ট্যগুলি বিস্ময়করভাবে কাজ করতে পারে, তাই আমি যে জ্ঞানটি শিখেছি তা খুব পুরানো হতে পারে এবং এর মধ্যে যদি কোনও পারফরম্যান্সের পার্থক্য থাকে তবে আমি কখনই প্রোফাইলে বিরক্ত হইনি profile

void fooByValue(SomeDataStruct data);   

এবং

void fooByReference(const SomeDataStruct& data);

আমি যে অনুশীলনটি শিখেছি - কনস্ট রেফারেন্সগুলি পাস করা (অ-তুচ্ছ ধরণের জন্য ডিফল্টরূপে) - অকাল অপটিমাইজেশন?


1
আরও দেখুন: বিভিন্ন পরামিতি পাসের কৌশলগুলির আলোচনার জন্য সি ++ কোর গাইডলাইনে এফ.এল.এল।
amon


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

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

1
@ ডকব্রাউন: সুতরাং, আপনি এটিকে দুপুটি ঘোষণার আগে, প্রশ্নটিতে কোথায় এটি নির্দেশ করুন যে সংকলকটিকে অনুমতি দেওয়া হবে এবং এটি "অনুকূলিত" করতে সক্ষম হবে।
Deduplicator

উত্তর:


49

"অকাল অপ্টিমাইজেশান" optimisations ব্যবহার সম্পর্কে নয় গোড়ার দিকে । সমস্যাটি বোঝার আগে, রানটাইম বোঝার আগে, এবং প্রায়শই কোড কম পাঠযোগ্য এবং সন্দেহজনক ফলাফলের জন্য কম রক্ষণযোগ্য করে তোলে এমনটি সমস্যাটি বোঝার আগে এটি অনুকূলকরণ সম্পর্কে।

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


2
আমি আপনার উত্তরের "ব্যবহারিকভাবে কোনও চেষ্টা করব না" অংশে সম্মত। তবে অকাল অপ্টিমাইজেশন অপ্টিমাইজেশন সম্পর্কে প্রথম এবং সর্বাগ্রে তাদের উল্লেখযোগ্য, পরিমাপকৃত কর্মক্ষমতা প্রভাব is এবং আমি মনে করি না বেশিরভাগ সি ++ প্রোগ্রামাররা (যার মধ্যে আমি অন্তর্ভুক্ত) ব্যবহারের আগে কোনও পরিমাপ করে না const&, তাই আমি মনে করি প্রশ্নটি যথেষ্ট সংবেদনশীল।
ডক ব্রাউন

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

3
আমি কোনও সি বিশেষজ্ঞ নই, তাই একটি প্রশ্ন:। const& fooবলেছেন যে ফাংশনটি ফু-র পরিবর্তন করবে না, তাই কলার নিরাপদ। তবে একটি অনুলিপি করা মান বলছে যে অন্য কোনও থ্রেড ফু বদলাতে পারে না, তাই কলি নিরাপদ। রাইট? সুতরাং, একটি বহু-থ্রেড অ্যাপে উত্তরটি নির্ভুলতার উপর নির্ভর করে, অপ্টিমাইজেশান নয়।
user949300

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

1
@ ব্যবহারকারী949300: কয়েকটি ফাংশন তাদের যুক্তিগুলি একই সাথে বা ব্যবহৃত কলব্যাকগুলির মাধ্যমে সংশোধন করার অনুমতি দেয় এবং তারা স্পষ্টভাবে তা বলে।
অনুচ্ছেদে

16

টিএল; ডিআর: কনস রেফারেন্স রেফারেন্সটি সি ++ এ এখনও বিবেচনা করা সমস্ত বিষয় 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 ++ ঘৃণা করে না, সোর্স কোডে কনস্ট-রেফারেন্স লেখার বা পড়ার ওভারহেড ভয়ঙ্কর নয়।

ব্যয়-বেনিফিট বিশ্লেষণগুলি এর আগেও অনেকবার করা হতে পারে। আমি জানি না যে এমন কোনও বৈজ্ঞানিক বিষয় রয়েছে যা উদ্ধৃত করা উচিত। আমার ধারণা বেশিরভাগ বিশ্লেষণগুলি অ বৈজ্ঞানিক বা অ পুনঃপ্রজননযোগ্য হবে।

আমি যা কল্পনা করি (প্রমাণ বা বিশ্বাসযোগ্য উল্লেখ ছাড়াই) এখানে ...

  • হ্যাঁ, এটি এই ভাষায় লেখা সফ্টওয়্যারটির কার্যকারিতাকে প্রভাবিত করে।
  • সংকলকগণ যদি কোডের উদ্দেশ্য বুঝতে পারে তবে এটি স্বয়ংক্রিয়ভাবে চালানোর পক্ষে এটি যথেষ্ট স্মার্ট হতে পারে
  • দুর্ভাগ্যক্রমে, যে ভাষাগুলিতে পরিবর্তনীয়তার পক্ষে (ক্রিয়ামূলক বিশুদ্ধতার বিপরীতে), সংকলক বেশিরভাগ জিনিসকে রূপান্তরিত হিসাবে শ্রেণিবদ্ধ করবে, সুতরাং স্থিরতার স্বয়ংক্রিয়ভাবে কর্তন বেশিরভাগ জিনিসকে অ-কনস্ট্যান্ট হিসাবে প্রত্যাখ্যান করবে
  • মানসিক ওভারহেড মানুষের উপর নির্ভর করে; যে লোকেরা এটিকে উচ্চ মানসিক ওভারহেড বলে মনে করে তারা সি ++ কে একটি व्यवहार्य প্রোগ্রামিং ভাষা হিসাবে প্রত্যাখ্যান করে।

এটি এমন একটি পরিস্থিতিতে যেখানে আমি চাই যে আমি কেবল একটিই বেছে না নেওয়ার পরিবর্তে দুটি উত্তর গ্রহণ করতে পারি ... দীর্ঘশ্বাস
ফেলুন

8

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

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


3
"আপনার যদি একটি মাত্র বাছাই করতে হয় তবে স্পষ্টতা বাছাই করুন" " দ্বিতীয়টি হওয়া উচিত পরিবর্তে পছন্দ করা , কারণ আপনি অন্যটিকে বেছে নিতে বাধ্য হতে পারেন।
উত্সাহীকারী

@ অনুদানকারী আপনাকে ধন্যবাদ ওপি'র প্রসঙ্গে যদিও প্রোগ্রামারটি বেছে নেওয়ার স্বাধীনতা অর্জন করে।
লরেন্স

আপনার উত্তরটি এর চেয়ে কিছুটা সাধারণ পড়ছে যদিও ...
উত্সাহক

@ উত্সাহী আহ, তবে আমার উত্তরের প্রসঙ্গটি (এটিও) যে প্রোগ্রামার চয়ন করে। যদি প্রোগ্রামারটিতে পছন্দটি বাধ্য করা হয় তবে এটি "আপনি" হবেনা যা বাছাই করবে না :)। আপনার প্রস্তাবিত পরিবর্তনটি আমি বিবেচনা করেছি এবং সেই অনুসারে আমার উত্তর সম্পাদনা করাতে আপনি আপত্তি করবেন না, তবে আমি এর স্পষ্টতার জন্য বিদ্যমান শব্দটিকে পছন্দ করি।
লরেন্স

7

([কনস্ট] [মূল্য]] রেফারেন্স) দ্বারা পাস করা | (মান) ইন্টারফেসের মাধ্যমে করা উদ্দেশ্য এবং প্রতিশ্রুতি সম্পর্কে হওয়া উচিত। পারফরম্যান্সের সাথে এর কোনও যোগসূত্র নেই।

রিচির থাম্বের বিধি:

void foo(X x);          // I intend to own the x you gave me, whether by copy, move or direct initialisation on the call stack.     

void foo(X&& x);        // I intend to steal x from you. Do not use it other than to re-assign to it after calling me.

void foo(X const& x);   // I guarantee not to change your x

void foo(X& x);         // I may modify your x and I will leave it in a defined state

3

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

কনস্ট্যান্ড রেফারেন্স দিয়ে পাস করার নির্দিষ্ট ক্ষেত্রে, তবে আমি বলব আইডিয়ামটি এতটাই সুপ্রতিষ্ঠিত হয়েছে যে পরিস্থিতি কমবেশি বিপরীত হয়েছে: আপনি না জানলে টাইপটি char/ short/ int/ হবেlong , লোকেরা এটি কনস্টের দ্বারা পাস হওয়া দেখতে প্রত্যাশা করে ডিফল্টরূপে রেফারেন্স, সুতরাং আপনার অন্যথায় করণে মোটামুটি নির্দিষ্ট কারণ না থাকলে সম্ভবত এটির সাথে চলাই ভাল।

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