এর মধ্যে পারফরম্যান্সের পার্থক্য রয়েছে i++
এবং ++i
যদি ফলস্বরূপ মানটি ব্যবহার না করা হয়?
এর মধ্যে পারফরম্যান্সের পার্থক্য রয়েছে i++
এবং ++i
যদি ফলস্বরূপ মানটি ব্যবহার না করা হয়?
উত্তর:
কার্যনির্বাহী সারাংশ: না
i++
সম্ভাব্যতার চেয়ে ধীর হতে পারে ++i
, যেহেতু i
পরবর্তী ব্যবহারের জন্য পুরানো মানটি সংরক্ষণের প্রয়োজন হতে পারে তবে অনুশীলনে সমস্ত আধুনিক সংকলক এটি এটিকে অপ্টিমাইজ করবে।
আমরা এই ফাংশনটির কোডটি দেখে ++i
এবং এর সাথে উভয়ই প্রদর্শন করতে পারি i++
।
$ cat i++.c
extern void g(int i);
void f()
{
int i;
for (i = 0; i < 100; i++)
g(i);
}
ফাইলগুলি একই ++i
এবং বাদে একই রকম i++
:
$ diff i++.c ++i.c
6c6
< for (i = 0; i < 100; i++)
---
> for (i = 0; i < 100; ++i)
আমরা সেগুলি সংকলন করব এবং উত্পন্ন এসেমব্লারও পেয়ে যাব:
$ gcc -c i++.c ++i.c
$ gcc -S i++.c ++i.c
এবং আমরা দেখতে পাচ্ছি যে উত্পন্ন বস্তু এবং এসেম্বলারের ফাইল উভয়ই এক রকম are
$ md5 i++.s ++i.s
MD5 (i++.s) = 90f620dda862cd0205cd5db1f2c8c06e
MD5 (++i.s) = 90f620dda862cd0205cd5db1f2c8c06e
$ md5 *.o
MD5 (++i.o) = dd3ef1408d3a9e4287facccec53f7d22
MD5 (i++.o) = dd3ef1408d3a9e4287facccec53f7d22
++i
পরিবর্তে এখনও ব্যবহার করা ভাল অনুশীলন i++
। না করার কোনও কারণ নেই এবং যদি আপনার সফ্টওয়্যারটি এমন কোনও সরঞ্জামচেইনের মধ্য দিয়ে যায় যা এটি অনুকূল করে না আপনার সফ্টওয়্যারটি আরও কার্যকর হবে efficient এটি টাইপ করা ++i
যেমন ঠিক তত সহজ, বিবেচনা করে i++
সত্যই ++i
প্রথম জায়গায় ব্যবহার না করার কোনও বাহানা নেই ।
দক্ষতা বনাম অভিপ্রায় থেকে অ্যান্ড্রু কোয়েগের উদ্দেশ্য :
প্রথমত, এটি সুস্পষ্ট থেকে দূরে যে
++i
এটি আরও কার্যকরi++
, কমপক্ষে যেখানে পূর্ণসংখ্যার ভেরিয়েবল সম্পর্কিত।
এবং :
সুতরাং যে প্রশ্নটি জিজ্ঞাসা করা উচিত তা নয় যে এই দুটি অপারেশনগুলির মধ্যে কোনটি দ্রুত, এটি আপনি যেটি সম্পাদন করতে চেষ্টা করছেন তা এই দুটি অপারেশনের মধ্যে আরও সঠিকভাবে প্রকাশ করে। আমি জমা দিচ্ছি যে আপনি যদি এক্সপ্রেশনটির মান ব্যবহার
i++
না করেন তবে এর পরিবর্তে কখনও ব্যবহার করার++i
কারণ নেই কারণ ভেরিয়েবলের মান কপি করার কোনও কারণ নেই, ভেরিয়েবলের বর্ধন করা হবে এবং তারপরে অনুলিপিটি ফেলে দিন।
সুতরাং, যদি ফলাফলটির মানটি ব্যবহার না করা হয় তবে আমি ব্যবহার করব ++i
। তবে এটি বেশি দক্ষ বলে নয়: কারণ এটি আমার উদ্দেশ্যকে সঠিকভাবে জানিয়েছে।
i++
একইভাবে কোডটি কোড করেছি i += n
বা i = i + n
, যেমন ফর্ম টার্গেট ক্রিয়া অবজেক্টে । ক্ষেত্রে , কোনও ডান বস্তু নেই , তবে ক্রিয়া অপারেটরের বামে লক্ষ্য রেখে, নিয়মটি এখনও প্রয়োগ হয় । i++
আরও ভাল উত্তর হ'ল এটি ++i
কখনও কখনও দ্রুত হবে তবে ধীর হবে না।
সবাই যে অভিমানী হবে বলে মনে হয় i
একজন নিয়মিত বিল্ট-ইন টাইপ যেমন হয় int
। এক্ষেত্রে কোনও পরিমাপযোগ্য পার্থক্য থাকবে না।
তবে যদি i
জটিল ধরণের হয় তবে আপনি একটি পরিমাপযোগ্য পার্থক্যটি ভালভাবে খুঁজে পেতে পারেন। জন্য i++
আপনি এটা বৃদ্ধিশীল আগে আপনার বর্গ একটি কপি করতে হবে। কোনও অনুলিপিতে কী জড়িত তার উপর নির্ভর করে এটি ++it
আপনার পক্ষে চূড়ান্ত মানটি ফেরত দিতে পারায় এটি ধীর হতে পারে ।
Foo Foo::operator++()
{
Foo oldFoo = *this; // copy existing value - could be slow
// yadda yadda, do increment
return oldFoo;
}
আর একটি পার্থক্য হ'ল ++i
আপনার সাথে মানটির পরিবর্তে একটি রেফারেন্স ফেরত দেওয়ার বিকল্প রয়েছে। আবার, আপনার বস্তুর অনুলিপি তৈরিতে কী জড়িত তার উপর নির্ভর করে এটি ধীর হতে পারে।
এটি ঘটতে পারে তার একটি আসল-বিশ্বের উদাহরণ হ'ল পুনরাবৃত্তির ব্যবহার। একটি আউটরেটার অনুলিপি করা আপনার আবেদনে বোতল-ঘাড় হওয়ার সম্ভাবনা নেই, তবে ফলাফলটি প্রভাবিত হয় না এমন ++i
জায়গায় ব্যবহার করার অভ্যাসে প্রবেশ করা এখনও ভাল অভ্যাস i++
।
সংক্ষিপ্ত উত্তর:
গতির দিক থেকে i++
এবং এর ++i
মধ্যে কখনও কোনও পার্থক্য নেই । একটি ভাল সংকলক দুটি ক্ষেত্রে পৃথক কোড উত্পন্ন করা উচিত নয়।
দীর্ঘ উত্তর:
কি প্রত্যেক অন্যান্য উত্তর উল্লেখ করতে ব্যর্থ যে মধ্যে পার্থক্য ++i
বনাম i++
শুধুমাত্র অভিব্যক্তি তা পাওয়া যাবে মধ্যে জ্ঞান করে তোলে।
এর ক্ষেত্রে for(i=0; i<n; i++)
, i++
এর নিজস্ব প্রকাশে একা থাকে: এর আগে একটি সিকোয়েন্স পয়েন্ট থাকে i++
এবং এর পরেও একটি থাকে is সুতরাং উত্পন্ন একমাত্র মেশিন কোডটি " i
বাই বৃদ্ধি 1
" এবং এটি সঠিকভাবে সংজ্ঞায়িত করা হয় যে কীভাবে এটি প্রোগ্রামের বাকী অংশের সাথে সিকোয়েন্সড হয়। সুতরাং আপনি তার প্রিফিক্স এটি পরিবর্তন করবে ++
, তাই না ব্যাপার নামমাত্র মধ্যে, আপনি কি এখনও ঠিক মেশিন কোড "বৃদ্ধি পেতে হবে হবে i
দ্বারা 1
"।
পার্থক্য ++i
এবং i++
কেবল array[i++] = x;
বনাম হিসাবে এক্সপ্রেশন মধ্যে বিষয় array[++i] = x;
। কেউ কেউ তর্ক করতে পারেন এবং বলতে পারেন যে পোস্টফিক্স এই ধরণের ক্রিয়াকলাপগুলিতে ধীর হবে কারণ যেখানে রেজিস্টার সেখানে রেজিস্টার i
পরে পুনরায় লোড করতে হবে। তবে নোট করুন যে সংকলকটি আপনার নির্দেশাবলীর যে কোনও উপায়ে পছন্দ করতে অর্ডার করতে মুক্ত, যতক্ষণ না এটি "স্ট্যান্ডার্ড মেশিনের আচরণ ভঙ্গ করে না" যতক্ষণ না সি স্ট্যান্ডার্ড কল করে।
সুতরাং আপনি যখন ধরে নিতে পারেন যে array[i++] = x;
মেশিন কোডটিতে অনুবাদ হয়েছে:
i
এ রেজিস্টার এ স্টোর মানi
এ রেজিস্টার এ স্টোরের মান // অকার্যকর কারণ এখানে অতিরিক্ত নির্দেশনা, আমরা ইতিমধ্যে একবার এটি করেছি।i
।সংকলকটি আরও কার্যকরভাবে কোড তৈরি করতে পারে যেমন:
i
এ রেজিস্টার এ স্টোর মানi
।আপনি যেহেতু সি প্রোগ্রামার হিসাবে পোস্টফিক্সটি ++
শেষের দিকে ঘটেছিল তা ভেবে প্রশিক্ষিত হওয়ায় মেশিন কোডটি সেভাবে অর্ডার করতে হবে না।
সুতরাং ++
সি-এর উপসর্গ এবং পোস্টফিক্সের মধ্যে কোনও পার্থক্য নেই এখন আপনি সি প্রোগ্রামার হিসাবে যা আলাদা হওয়া উচিত তা হ'ল এমন লোকেরা যে কোনও কারণে যুক্তি ছাড়াই কিছু ক্ষেত্রে প্রিফিক্স এবং পোস্টফিক্স ব্যবহার করে। এটি পরামর্শ দেয় যে সি কীভাবে কাজ করে সে সম্পর্কে তারা অনিশ্চিত বা তাদের ভাষা সম্পর্কে ভুল জ্ঞান রয়েছে। এটি সর্বদা একটি খারাপ লক্ষণ, এটি পরিবর্তিত পরামর্শ দেয় যে তারা তাদের কর্মসূচিতে অন্যান্য প্রশ্নবিদ্ধ সিদ্ধান্ত নেবে, কুসংস্কার বা "ধর্মীয় মতবাদ" এর ভিত্তিতে।
"উপসর্গ ++
সবসময় দ্রুত" প্রকৃতপক্ষে এমন একটি ভ্রান্ত মতবাদ যা সি প্রোগ্রামারদের মধ্যে সাধারণ।
স্কট মেয়ার্স থেকে একটি পাতা নেওয়া, আরও কার্যকর সি ++ আইটেম 6: বর্ধিতকরণ এবং হ্রাস ক্রিয়াকলাপগুলির উপসর্গ এবং পোস্টফিক্স ফর্মের মধ্যে পার্থক্য করুন ।
উপসর্গের ক্ষেত্রে প্রিফিক্স সংস্করণটি সর্বদা পোস্টফিক্সের চেয়ে বেশি পছন্দ হয় বিশেষত পুনরাবৃত্তির ক্ষেত্রে।
অপারেটরদের কল প্যাটার্নটি যদি দেখেন তবে এর কারণ।
// Prefix
Integer& Integer::operator++()
{
*this += 1;
return *this;
}
// Postfix
const Integer Integer::operator++(int)
{
Integer oldValue = *this;
++(*this);
return oldValue;
}
এই উদাহরণটি দেখে সহজেই বোঝা যায় কীভাবে উপসর্গ অপারেটর সর্বদা পোস্টফিক্সের চেয়ে আরও দক্ষ হবে। কারণ পোস্টফিক্স ব্যবহারে একটি অস্থায়ী বস্তুর প্রয়োজন।
এই কারণেই যখন আপনি পুনরাবৃত্তকারী ব্যবহার করে উদাহরণগুলি দেখেন তারা সর্বদা উপসর্গ সংস্করণ ব্যবহার করে।
কিন্তু আপনি যখন ইন্টের জন্য চিহ্নিত করেছেন তেমন কার্যকরভাবে কোনও পার্থক্য নেই কারণ সংঘটিত অপ্টিমাইজেশানটি ঘটতে পারে।
আপনি যদি মাইক্রো অপ্টিমাইজেশন সম্পর্কে উদ্বিগ্ন হন তবে এখানে একটি অতিরিক্ত পর্যবেক্ষণ রয়েছে। লুপগুলি ক্রমবর্ধমান লুপগুলি (সম্ভবত নির্দেশের আর্কিটেকচারের উপর নির্ভর করে যেমন এআরএম) আরও কার্যকর হতে পারে, প্রদত্ত লুপগুলি:
for (i = 0; i < 100; i++)
প্রতিটি লুপে আপনার প্রতিটি জন্য একটি নির্দেশ থাকবে:
1
করা হচ্ছে i
। i
চেয়ে কম কিনা তা তুলনা করুন 100
।i
চেয়ে কম হয় 100
।যদিও একটি হ্রাসকারী লুপ:
for (i = 100; i != 0; i--)
লুপটির প্রত্যেকটির জন্য একটি নির্দেশনা থাকবে:
i
, সিপিইউ নিবন্ধের স্থিতির পতাকা সেট করে।Z==0
)।অবশ্যই এটি কেবল তখনই কাজ করে যখন হ্রাস শূন্যে!
এআরএম সিস্টেম বিকাশকারী গাইড থেকে স্মরণ করা।
"কোনটি আরও দ্রুত" এর প্রশ্নটি কোনটি ব্যবহার করবেন তা সিদ্ধান্ত নেওয়ার কারণ হতে দেবেন না। সম্ভাবনা হ'ল আপনি কখনই এতো যত্ন নিচ্ছেন না, এবং প্রোগ্রামার পড়ার সময়টি মেশিনের সময়ের চেয়ে অনেক বেশি ব্যয়বহুল।
কোডটি পড়ার জন্য মানুষের মধ্যে যে কোনওটি সর্বাধিক উপলব্ধি করে।
প্রথমত: এর মধ্যে পার্থক্য i++
এবং ++i
সি তে অবহেলাযোগ্য
বিস্তারিত।
++i
দ্রুততরসি ++ এ, ++i
আরও কার্যকর iff i
কোনও ওভারলোডেড ইনক্রিমেন্ট অপারেটর সহ কোনও ধরণের অবজেক্ট।
কেন?
ইন ++i
, অবজেক্টটি প্রথমে বর্ধিত হয় এবং পরবর্তীকালে অন্য কোনও ক্রিয়াকলাপের জন্য একটি কনস্ট্যান্ড রেফারেন্স হিসাবে পাস হতে পারে। এক্সপ্রেশনটি হ'ল এটি সম্ভব নয় foo(i++)
কারণ এখন ইনক্রিমেন্টটি foo()
বলা হওয়ার আগেই করা দরকার, তবে পুরানো মানটি পাস করা দরকার foo()
। ফলস্বরূপ, সংকলক এর একটি অনুলিপি তৈরি করতে বাধ্য হয়i
সংকলকটি মূলটিতে ইনক্রিমেন্ট অপারেটর কার্যকর করার আগে । অতিরিক্ত কনস্ট্রাক্টর / ডেস্ট্রাক্টর কলগুলি খারাপ অংশ।
উপরে উল্লিখিত হিসাবে, এটি মৌলিক ধরণের ক্ষেত্রে প্রযোজ্য নয়।
i++
হতে পারেযদি কোনও কনস্ট্রাক্টর / ডেস্ট্রাক্টরকে ডেকে আনা প্রয়োজন না হয়, যা সর্বদা সি-তে ঘটে থাকে ++i
এবং i++
একইভাবে দ্রুত হওয়া উচিত, তাই না? না। তারা কার্যত সমান দ্রুত, তবে কিছু ছোট পার্থক্য থাকতে পারে, যা বেশিরভাগ অন্যান্য উত্তরদাতারা ভুল উপায়ে পেয়েছিলেন।
কীভাবে i++
দ্রুত হতে পারে?
পয়েন্টটি ডেটা নির্ভরতা। মানটি যদি মেমরি থেকে লোড করা দরকার হয় তবে এর সাথে দুটি ক্রিয়াকলাপ করা দরকার, এটি বাড়ানো এবং এটি ব্যবহার করা। সাথে ++i
, মানটি ব্যবহারের আগে বর্ধন করা দরকার । এর সাথে i++
, ব্যবহারটি ইনক্রিমেন্টের উপর নির্ভর করে না, এবং সিপিইউ ইনক্রিমেন্ট অপারেশনের সমান্তরালে ব্যবহার অপারেশন করতে পারে । পার্থক্যটি সর্বাধিক একটি সিপিইউ চক্রের, তাই এটি সত্যিই অবহেলাযোগ্য তবে এটি রয়েছে। এবং এটি অন্যভাবে রাউন্ডে তখন অনেকেই আশা করবে।
++i
বা i++
অন্য কোনও অভিব্যক্তির মধ্যে ব্যবহার করা হয়, তাদের মধ্যে পরিবর্তনগুলি অভিব্যক্তির শব্দার্থকে পরিবর্তন করে, সুতরাং কোনও সম্ভাব্য পারফরম্যান্স লাভ / ক্ষতি প্রশ্নবিদ্ধ নয়। যদি তারা স্বতন্ত্র থাকে, অর্থাৎ অপারেশনের ফলাফল অবিলম্বে ব্যবহার না করা হয় তবে কোনও শালীন সংকলক এটি একই জিনিসকে সংকলন করবে, উদাহরণস্বরূপ কোনও INC
সমাবেশ নির্দেশ inst
i++
এবং ++i
প্রায় প্রতিটি সম্ভাব্য পরিস্থিতিতে একে অপরের সাথে লুপ কনস্ট্যান্টগুলি সামঞ্জস্য করে ব্যবহার করা যেতে পারে, সুতরাং তারা প্রোগ্রামারের জন্য তারা যা করেন তার সমতুল্য। 2) উভয় একই নির্দেশনা সংকলন করা সত্ত্বেও, সিপিইউ জন্য তাদের মৃত্যুদন্ড পৃথক। এর ক্ষেত্রে i++
, সিপিইউ একই মূল্য ব্যবহার করে এমন কিছু অন্যান্য নির্দেশের সমান্তরালে বর্ধন গণনা করতে পারে (সিপিইউগুলি সত্যিই এটি করে!), যখন ++i
সিপিইউতে বর্ধনের পরে অন্যান্য নির্দেশের সময়সূচী করতে হয় ।
if(++foo == 7) bar();
এবং কার্যত if(foo++ == 6) bar();
সমতুল্য। যাইহোক, দ্বিতীয়টি একটি চক্র দ্রুত হতে পারে, কারণ তুলনা এবং বৃদ্ধি সিপিইউ দ্বারা সমান্তরালে গণনা করা যেতে পারে। এই একক চক্রটি খুব বেশি গুরুত্বপূর্ণ তা নয়, তবে পার্থক্য রয়েছে।
<
উদাহরণস্বরূপ বনাম <=
) যেখানে ++
সাধারণত ব্যবহৃত হয়, তাই যদিও এর মধ্যে রূপান্তর প্রায়শই সহজেই সম্ভব।
@ মার্ক যদিও সংকলকটি ভেরিয়েবল এবং জিসিসি (সাম্প্রতিক সংস্করণগুলিতে) এর অস্থায়ী অনুলিপি (স্ট্যাক ভিত্তিক) অপ্টিমাইজ করার অনুমতি দিচ্ছে, তার অর্থ এই নয় যে সমস্ত সংকলক সর্বদা এটি করবে।
আমি এটি কেবল আমাদের বর্তমান প্রকল্পে যে সংকলকগুলি ব্যবহার করি তা দিয়ে পরীক্ষা করেছি এবং 4 টির মধ্যে 3 এটি অপ্টিমাইজ করে না।
সংকলকটি এটি সঠিকভাবে পায় তা কখনই অনুমান করবেন না, বিশেষত যদি দ্রুততর হয় তবে ধীর কোডটি কখনই পড়া সহজ হয় না।
আপনার কোডে অপারেটরগুলির মধ্যে একটির যদি সত্যিই নির্বোধ বাস্তবায়ন না হয়:
আলওয়াস i++ এর চেয়ে বেশি ++ পছন্দ করে।
সি-তে, ফলাফলটি অব্যবহৃত হলে সংকলক সাধারণত তাদের একই হতে পারে।
তবে, সি ++ এ যদি অন্য ধরণের ব্যবহার করেন যা তাদের নিজস্ব ++ অপারেটরগুলি সরবরাহ করে, উপসর্গ সংস্করণটি পোস্টফিক্স সংস্করণের চেয়ে দ্রুত হতে পারে। সুতরাং, আপনার যদি পোস্টফিক্স সিমানটিকসের প্রয়োজন না হয় তবে প্রিফিক্স অপারেটরটি ব্যবহার করা ভাল।
আমি এমন পরিস্থিতিতে ভাবতে পারি যেখানে উপসর্গের বর্ধনের তুলনায় পোস্টফিক্স ধীরে ধীরে:
কল্পনা করুন যে রেজিস্টার সহ একটি প্রসেসর A
সংগ্রহকারী হিসাবে ব্যবহৃত হয় এবং এটি বহু নির্দেশাবলীতে ব্যবহৃত একমাত্র নিবন্ধক (কিছু ছোট মাইক্রোকন্ট্রোলার প্রকৃতপক্ষে এরকম হয়)।
এখন নিম্নলিখিত প্রোগ্রাম এবং তাদের অনুমানমূলক সমাবেশে অনুবাদ অনুমান করুন:
উপসর্গ বৃদ্ধি:
a = ++b + c;
; increment b
LD A, [&b]
INC A
ST A, [&b]
; add with c
ADD A, [&c]
; store in a
ST A, [&a]
পোস্টফিক্স ইনক্রিমেন্ট:
a = b++ + c;
; load b
LD A, [&b]
; add with c
ADD A, [&c]
; store in a
ST A, [&a]
; increment b
LD A, [&b]
INC A
ST A, [&b]
কীভাবে মানটির b
পুনরায় লোড করা হয়েছিল তা নোট করুন । উপসর্গ ইনক্রিমেন্টের সাথে, সংকলকটি কেবলমাত্র মূল্য বৃদ্ধি করতে পারে এবং এটি ব্যবহার করে এগিয়ে যেতে পারে, সম্ভবত এটি পুনরায় লোড করা এড়াতে পারেন কারণ বর্ধিত হওয়ার পরে পছন্দসই মানটি ইতিমধ্যে নিবন্ধে রয়েছে। যাইহোক, পোস্টফিক্স ইনক্রিমেন্টের সাথে, সংকলকটিকে দুটি মানের সাথে ডিল করতে হবে, একটি পুরানো এবং একটি বর্ধিত মান যা আমি উপরের ফলাফলগুলিতে দেখিয়েছি আরও একটি মেমরি অ্যাক্সেস রয়েছে।
অবশ্যই, যদি ইনক্রিমেন্টের মান ব্যবহার না করা হয়, যেমন একটি একক i++;
বিবৃতি, সংকলক পোস্টফিক্স বা উপসর্গের ব্যবহার নির্বিশেষে কেবল ইনক্রিমেন্টের নির্দেশিকা তৈরি করতে পারে (এবং করবে)।
পার্শ্ব নোট হিসাবে, আমি উল্লেখ করতে চাই যে একটি অভিব্যক্তি যেখানে b++
কেবল ++b
কোনও অতিরিক্ত প্রচেষ্টা ছাড়াই একটিতে রূপান্তরিত হতে পারে না (উদাহরণস্বরূপ এ যোগ করে - 1
)। সুতরাং তারা যদি কিছু অভিব্যক্তির অংশ হয় তবে দুটি তুলনা করা সত্যই বৈধ নয়। প্রায়শই, আপনি যেখানে b++
কোনও অভিব্যক্তির ভিতরে ব্যবহার করেন আপনি ব্যবহার করতে পারবেন না ++b
, তাই সম্ভবত ++b
সম্ভাব্যতর দক্ষ হওয়া সত্ত্বেও এটি ভুল হবে। ব্যতিক্রম অবশ্যই হয় যদি অভিব্যক্তিটি এর জন্য ভিক্ষা করে থাকে (উদাহরণস্বরূপ a = b++ + 1;
যা এতে পরিবর্তিত হতে পারে a = ++b;
)।
আমি উত্তর এখানে অধিকাংশ এবং মন্তব্য অনেক মাধ্যমে পড়া হয়েছে, এবং আমি কোনো রেফারেন্স দেখতে পাইনি এক উদাহরণ হিসেবে বলা যায় আমি কোথায় মনে করতে পারে যে i++
অধিক কার্যকরী হয় ++i
(এবং সম্ভবত এটি আশ্চর্যজনক --i
ছিল অধিক কার্যকরী i--
)। এটি ডিসি পিডিপি -11 এর সি সংকলকগুলির জন্য!
পিডিপি -11 এর নিবন্ধকার প্রাক-হ্রাস এবং পোস্ট-ইনক্রিমেন্টের জন্য সমাবেশের নির্দেশনা ছিল, তবে অন্যভাবে নয়। নির্দেশাবলী কোনও "সাধারণ-উদ্দেশ্য" নিবন্ধটিকে স্ট্যাক পয়েন্টার হিসাবে ব্যবহার করার অনুমতি দেয়। সুতরাং আপনি যদি এমন কিছু ব্যবহার করেন তবে *(i++)
এটি একটি একক সমাবেশের নির্দেশে সংকলন করা যেতে পারে, যদিও *(++i)
পারে না।
এটি স্পষ্টতই একটি অত্যন্ত রহস্যজনক উদাহরণ, তবে পোস্ট-ইনক্রিমেন্ট যেখানে আরও দক্ষ ( সেখানে আমার বলা উচিত ছিল , যেহেতু আজকাল পিডিপি -11 সি কোডের খুব বেশি চাহিদা নেই)।
--i
এবং i++
।
আমি সবসময় প্রাক-বর্ধন পছন্দ করি, তবে ...
আমি এটি উল্লেখ করতে চেয়েছিলাম যে এমনকি অপারেটরকে ++ ফাংশন কল করার ক্ষেত্রেও, সংকলকটি যদি ফাংশনটি অন্তর্ভুক্ত হয় তবে অস্থায়ীভাবে অপসারণ করতে সক্ষম হবে। যেহেতু অপারেটরটি ++ সাধারণত সংক্ষিপ্ত হয় এবং প্রায়শই শিরোনামে প্রয়োগ করা হয় তাই এটি অন্তর্ভুক্ত হওয়ার সম্ভাবনা রয়েছে।
সুতরাং, ব্যবহারিক উদ্দেশ্যে, সম্ভবত দুটি ফর্মের পারফরম্যান্সের মধ্যে খুব বেশি পার্থক্য নেই। তবে আমি সর্বদা প্রাক-বর্ধন অগ্রাধিকার পছন্দ করি যেহেতু আমি যা বলার চেষ্টা করছি তা সরাসরি প্রকাশ করা ভাল বলে মনে হয়, এটি বের করার জন্য অপ্টিমাইজারের উপর নির্ভর না করে।
এছাড়াও, অপ্টিমাইজারকে কম করার সম্ভাবনা মানে কম্পাইলারটি দ্রুত চলে।
আমার সি কিছুটা মরিচা, তাই আগেই ক্ষমা চেয়ে নিচ্ছি। দ্রুতগতিতে, আমি ফলাফলগুলি বুঝতে পারি। তবে, আমি উভয় ফাইলই কীভাবে একই এমডি 5 হ্যাশ এ এসেছিল তা নিয়ে আমি বিভ্রান্ত। লুপের জন্য একটি একই চলতে পারে, তবে কি নিম্নলিখিত 2 টি লাইন কোড বিভিন্ন সমাবেশ তৈরি করে না?
myArray[i++] = "hello";
বনাম
myArray[++i] = "hello";
প্রথমটি অ্যারেতে মান লিখছে, তারপরে ইনক্রিমেন্টগুলি i। দ্বিতীয় বার্ষিকী আমি তারপরে অ্যারেতে লিখি। আমি কোনও সমাবেশের বিশেষজ্ঞ নই, তবে আমি ঠিক দেখতে পাচ্ছি না কীভাবে এই 2 টি ভিন্ন লাইন কোডের মাধ্যমে একই নির্বাহযোগ্য তৈরি করা হবে।
শুধু আমার দুই সেন্ট।
foo[i++]
করার জন্য foo[++i]
অন্য কিছু পরিবর্তন স্পষ্টত প্রোগ্রাম শব্দার্থবিদ্যা পরিবর্তন হবে ছাড়া, কিন্তু একটি লুপ-উত্তোলন অপ্টিমাইজেশান যুক্তিবিজ্ঞান ছাড়া একটি কম্পাইলার ব্যবহার যখন কিছু প্রসেসরের উপর, বৃদ্ধিশীল p
এবং q
একবার এবং তারপর একটি লুপ যা সঞ্চালিত যেমন চলমান *(p++)=*(q++);
দ্রুততর একটি লুপ যা সঞ্চালিত ব্যবহার না করে হতে পারে *(++pp)=*(++q);
। কিছু প্রসেসরের খুব কড়া লুপের জন্য গতির পার্থক্য তাত্পর্যপূর্ণ হতে পারে (10% এর বেশি), তবে এটি সম্ভবত সি এর একমাত্র ক্ষেত্রে যেখানে পোস্ট-ইনক্রিমেন্ট প্রাক-ইনক্রিমেন্টের তুলনায় বস্তুগতভাবে দ্রুত।