আইতে ++ এবং ++ i এর মধ্যে পারফরম্যান্সের পার্থক্য রয়েছে কি?


471

এর মধ্যে পারফরম্যান্সের পার্থক্য রয়েছে i++এবং ++iযদি ফলস্বরূপ মানটি ব্যবহার না করা হয়?


1
সম্পর্কিত, একই প্রশ্ন কিন্তু সি জন্য স্পষ্টভাবে ++, হয় stackoverflow.com/questions/24901/...
FluxLemur

উত্তর:


396

কার্যনির্বাহী সারাংশ: না

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

9
আমি জানি এই প্রশ্নটি সি সম্পর্কে, তবে ব্রাউজাররা জাভাস্ক্রিপ্টের জন্য এই অপ্টিমাইজেশন করতে পারে কিনা তা জানতে আগ্রহী হব।
টিএম

69
সুতরাং আপনি যে সংকলনটি পরীক্ষা করেছেন তার জন্য "না" সত্য।
আন্দ্রেয়াস

173
@ আন্দ্রেস: ভাল প্রশ্ন আমি একটি সংকলক লেখক ছিলাম, এবং অনেক সিপিইউ, অপারেটিং সিস্টেম এবং সংকলকগুলিতে এই কোডটি পরীক্ষা করার সুযোগ পেয়েছিলাম। আমি একমাত্র সংকলকটি খুঁজে পেয়েছি যে আমি ++ কেসটিকে অনুকূলিত করে নি (আসলে, সংকলকটি যা পেশাদারভাবে এটি আমার নজরে এনেছে) হ'ল ওয়াল্ট বিলোফস্কির রচিত সফ্টওয়্যার টুলওয়ার্ক সি 80 সংকলক। এই সংকলকটি ইন্টেল 8080 সিপি / এম সিস্টেমগুলির জন্য ছিল। এটি বলা নিরাপদ যে কোনও সংকলক যা এই অপ্টিমাইজেশানটি অন্তর্ভুক্ত করে না এটি সাধারণ ব্যবহারের জন্য বোঝানো হয় না।
মার্ক হ্যারিসন

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

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

112

দক্ষতা বনাম অভিপ্রায় থেকে অ্যান্ড্রু কোয়েগের উদ্দেশ্য :

প্রথমত, এটি সুস্পষ্ট থেকে দূরে যে ++iএটি আরও কার্যকর i++, কমপক্ষে যেখানে পূর্ণসংখ্যার ভেরিয়েবল সম্পর্কিত।

এবং :

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

সুতরাং, যদি ফলাফলটির মানটি ব্যবহার না করা হয় তবে আমি ব্যবহার করব ++i। তবে এটি বেশি দক্ষ বলে নয়: কারণ এটি আমার উদ্দেশ্যকে সঠিকভাবে জানিয়েছে।


5
আসুন ভুলে যাবেন না যে অন্যান্য আনরি অপারেটরগুলিও প্রিফিক্স। আমি মনে করি যে আনরিয়ান অপারেটরটি ব্যবহার করার ++ আমিই "অর্থবোধক" উপায়, যখন নির্দিষ্ট প্রয়োজনের (যোগ করার পূর্বে মূল্যায়ন) ফিট করার জন্য আমি প্রায় কাছাকাছি।
টিএম

9
যদি ফলস্বরূপ মানটি ব্যবহার না করা হয়, তবে শব্দার্থবিজ্ঞানের মধ্যে কোনও তফাত নেই : অর্থাত, একটি বা অন্য নির্মাণকে পছন্দ করার কোনও ভিত্তি নেই।
ইমন নারবোনে

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

11
কোয়েনিগের পরামর্শ অনুসরণ করে, আমি ক্রিয়া অপারেটরের বাম দিকে লক্ষ্য অপারেন্ড সহ, i++একইভাবে কোডটি কোড করেছি i += nবা i = i + n, যেমন ফর্ম টার্গেট ক্রিয়া অবজেক্টে । ক্ষেত্রে , কোনও ডান বস্তু নেই , তবে ক্রিয়া অপারেটরের বামে লক্ষ্য রেখে, নিয়মটি এখনও প্রয়োগ হয় । i++
ডেভিড আর ট্রিবিলে

4
আপনি যদি i বৃদ্ধি করার চেষ্টা করছেন তবে আমি ++ এবং ++ আমি উভয়ই আপনার অভিপ্রায়টি সঠিকভাবে প্রকাশ করি। একে অপরের চেয়ে বেশি পছন্দ করার কোনও কারণ নেই। পাঠক হিসাবে আমি কোনও তফাত দেখতে পাচ্ছি না, আপনার সহকর্মীরা যখন আমাকে ++ দেখেন তখন তারা কি বিভ্রান্ত হন এবং ভাবেন, সম্ভবত এটি একটি টাইপো এবং তিনি আমার বর্ধিতকরণের অর্থ দেননি?
ড্যান কার্টার

46

আরও ভাল উত্তর হ'ল এটি ++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++


36
প্রশ্নটি স্পষ্টভাবে সি বর্ণ করে, সি ++ এর কোনও রেফারেন্স নেই।
ড্যান ক্রিস্টোলোভানু

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

-1 যদিও এটি সি ++ প্রোগ্রামারদের জন্য ভাল পরামর্শ, এটি সামান্যতম ক্ষেত্রেই সিটির ট্যাগযুক্ত প্রশ্নের উত্তর দেয় না। সি-তে, আপনি উপসর্গ বা পোস্টফিক্স ব্যবহার করেন কিনা তা একেবারেই কোনও পার্থক্য করে না।
লন্ডিন

@ পেসারিয়ার প্রশ্নটি কেবল সি, এবং সি ট্যাগ করা হয়েছে। কেন তারা ধরে নিচ্ছেন যে তারা এতে আগ্রহী নয়? এসও কীভাবে কাজ করে তা দেওয়া, এটি জাভা, সি #, সিওবিএল বা অন্য কোনও অফ-টিক ল্যাঙ্গুয়েজ বাদে কেবল তারা সি-তে আগ্রহী বলে ধরে নেওয়া কি স্মার্ট হবে না ?
লন্ডিন

18

সংক্ষিপ্ত উত্তর:

গতির দিক থেকে 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এ রেজিস্টার এ স্টোর মান
  • বি রেজিষ্টারে অ্যারের স্টোরের ঠিকানা
  • এ এবং বি যুক্ত করুন, এ ফলাফলের স্টোর করুন A.
  • এ দ্বারা প্রতিনিধিত্ব করা এই নতুন ঠিকানায়, এক্স এর মান সংরক্ষণ করুন।
  • iএ রেজিস্টার এ স্টোরের মান // অকার্যকর কারণ এখানে অতিরিক্ত নির্দেশনা, আমরা ইতিমধ্যে একবার এটি করেছি।
  • বৃদ্ধি রেজিস্টার এ।
  • স্টোর রেজিস্টার এ i

সংকলকটি আরও কার্যকরভাবে কোড তৈরি করতে পারে যেমন:

  • iএ রেজিস্টার এ স্টোর মান
  • বি রেজিষ্টারে অ্যারের স্টোরের ঠিকানা
  • এ এবং বি যুক্ত করুন, বি ফলাফল সংরক্ষণ করুন store
  • বৃদ্ধি রেজিস্টার এ।
  • স্টোর রেজিস্টার এ i
  • ... // কোড বাকি।

আপনি যেহেতু সি প্রোগ্রামার হিসাবে পোস্টফিক্সটি ++শেষের দিকে ঘটেছিল তা ভেবে প্রশিক্ষিত হওয়ায় মেশিন কোডটি সেভাবে অর্ডার করতে হবে না।

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

"উপসর্গ ++সবসময় দ্রুত" প্রকৃতপক্ষে এমন একটি ভ্রান্ত মতবাদ যা সি প্রোগ্রামারদের মধ্যে সাধারণ।


3
"উপসর্গ ++ সবসময় দ্রুত হয়" কেউ বলেনি। এটা ভুল বলা হয়েছে। তারা যা বলেছিল তা ছিল "পোস্টফিক্স ++ কখনও দ্রুত হয় না "।
পেসারিয়ার

2
@ পেসারিয়ার আমি কোনও নির্দিষ্ট ব্যক্তির উদ্ধৃতি দিচ্ছি না, তবে কেবল একটি বিস্তৃত, ভুল বিশ্বাস।
লন্ডিন

@ আরবালেকসন্দর সি ++! = সি
লুন্ডিন

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

3
@ আরবালিক্সান্দার সি ++ == গ &&++ সি! = সি
সাদলজকফালস্কডিজেফh

17

স্কট মেয়ার্স থেকে একটি পাতা নেওয়া, আরও কার্যকর সি ++ আইটেম 6: বর্ধিতকরণ এবং হ্রাস ক্রিয়াকলাপগুলির উপসর্গ এবং পোস্টফিক্স ফর্মের মধ্যে পার্থক্য করুন

উপসর্গের ক্ষেত্রে প্রিফিক্স সংস্করণটি সর্বদা পোস্টফিক্সের চেয়ে বেশি পছন্দ হয় বিশেষত পুনরাবৃত্তির ক্ষেত্রে।

অপারেটরদের কল প্যাটার্নটি যদি দেখেন তবে এর কারণ।

// Prefix
Integer& Integer::operator++()
{
    *this += 1;
    return *this;
}

// Postfix
const Integer Integer::operator++(int)
{
    Integer oldValue = *this;
    ++(*this);
    return oldValue;
}

এই উদাহরণটি দেখে সহজেই বোঝা যায় কীভাবে উপসর্গ অপারেটর সর্বদা পোস্টফিক্সের চেয়ে আরও দক্ষ হবে। কারণ পোস্টফিক্স ব্যবহারে একটি অস্থায়ী বস্তুর প্রয়োজন।

এই কারণেই যখন আপনি পুনরাবৃত্তকারী ব্যবহার করে উদাহরণগুলি দেখেন তারা সর্বদা উপসর্গ সংস্করণ ব্যবহার করে।

কিন্তু আপনি যখন ইন্টের জন্য চিহ্নিত করেছেন তেমন কার্যকরভাবে কোনও পার্থক্য নেই কারণ সংঘটিত অপ্টিমাইজেশানটি ঘটতে পারে।


4
আমি মনে করি তার প্রশ্নটি সি তে পরিচালিত হয়েছিল, তবে সি ++ এর জন্য আপনি একেবারেই সঠিক, এবং সি -++ এর জন্য সি-লোকেরাও এটি ব্যবহার করতে পারে বলে এটিকে গ্রহণ করা উচিত। আমি অনেক সময় দেখতে পাই সি প্রোগ্রামাররা পোস্টফিক্স সিনট্যাক্স ব্যবহার করে ;-)
এন্ডারস রুন জেনসেন

-1 যদিও এটি সি ++ প্রোগ্রামারদের জন্য ভাল পরামর্শ, এটি সামান্যতম ক্ষেত্রেই সিটির ট্যাগযুক্ত প্রশ্নের উত্তর দেয় না। সি-তে, আপনি উপসর্গ বা পোস্টফিক্স ব্যবহার করেন কিনা তা একেবারেই কোনও পার্থক্য করে না।
লন্ডিন

1
অ্যান্ড্রেয়াসের উত্তর অনুসারে @ লন্ডিনের উপসর্গ এবং পোস্টিফিক্স সিটিতে গুরুত্বপূর্ণ । আপনি ধরে নিতে পারেন না যে সংকলকটি
জেপ্রোগ্রামার

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

16

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

for (i = 0; i < 100; i++)

প্রতিটি লুপে আপনার প্রতিটি জন্য একটি নির্দেশ থাকবে:

  1. যোগ 1করা হচ্ছে i
  2. এর iচেয়ে কম কিনা তা তুলনা করুন 100
  3. শর্তাধীন শাখা যদি ক এর iচেয়ে কম হয় 100

যদিও একটি হ্রাসকারী লুপ:

for (i = 100; i != 0; i--)

লুপটির প্রত্যেকটির জন্য একটি নির্দেশনা থাকবে:

  1. হ্রাস i, সিপিইউ নিবন্ধের স্থিতির পতাকা সেট করে।
  2. সিপিইউ নিবন্ধকের স্থিতির উপর নির্ভর করে একটি শর্তাধীন শাখা ( Z==0)।

অবশ্যই এটি কেবল তখনই কাজ করে যখন হ্রাস শূন্যে!

এআরএম সিস্টেম বিকাশকারী গাইড থেকে স্মরণ করা।


ভাল একটা. কিন্তু এটি কি কম ক্যাচ হিট তৈরি করে না?
AndreasT

কোড অপ্টিমাইজেশন বইগুলি থেকে একটি পুরাতন অদ্ভুত কৌশল আছে, বর্ধিত ঠিকানার সাথে শূন্য-পরীক্ষার শাখার সুবিধার সাথে মিলিত। এখানে উচ্চ স্তরের ভাষার উদাহরণ (সম্ভবত অকেজো, যেহেতু অনেক সংকলক কম দক্ষ তবে আরও সাধারণ লুপ কোড দিয়ে এটি প্রতিস্থাপনের জন্য যথেষ্ট স্মার্ট ): ইনট্রি [এন]; (i = -N; i; ++ i) এর জন্য [এন + আই] + = 123;
noop

@ নুপ আপনি কী কোড অপ্টিমাইজেশনের বইগুলিকে উল্লেখ করেছেন তা সম্ভবত বিশদভাবে বলতে পারেন? আমি ভাল খুঁজে পেতে সংগ্রাম করেছি।
mezamorphic

7
এই উত্তরটি মোটেই প্রশ্নের উত্তর নয়।
মনোক্রোম

@ মিজামোরফিক x86 এর জন্য আমার সূত্রগুলি হ'ল: ইন্টেল অপ্টিমাইজেশান ম্যানুয়াল, আগনার ফগ, পল এসসি, মাইকেল আবরাশ।
noop

11

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

কোডটি পড়ার জন্য মানুষের মধ্যে যে কোনওটি সর্বাধিক উপলব্ধি করে।


3
আমি বিশ্বাস করি যে আসল দক্ষতা লাভ এবং অভিপ্রায়ের সামগ্রিক স্বচ্ছতার তুলনায় অস্পষ্ট পাঠযোগ্যতার উন্নতিগুলি পছন্দ করা ভুল।
noop

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

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

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

2
আমি এখনও রাজি হতে পারি না। পাঠযোগ্যতা যদি আপনার অগ্রাধিকারের তালিকার উপরে থাকে তবে আপনার প্রোগ্রামিং ভাষার পছন্দটি ভুল is সি / সি ++ প্রাথমিক উদ্দেশ্য দক্ষ কোড লিখছে।
noop

11

প্রথমত: এর মধ্যে পার্থক্য i++এবং ++iসি তে অবহেলাযোগ্য


বিস্তারিত।

1. সুপরিচিত সি ++ ইস্যু: ++iদ্রুততর

সি ++ এ, ++iআরও কার্যকর iff iকোনও ওভারলোডেড ইনক্রিমেন্ট অপারেটর সহ কোনও ধরণের অবজেক্ট।

কেন?
ইন ++i, অবজেক্টটি প্রথমে বর্ধিত হয় এবং পরবর্তীকালে অন্য কোনও ক্রিয়াকলাপের জন্য একটি কনস্ট্যান্ড রেফারেন্স হিসাবে পাস হতে পারে। এক্সপ্রেশনটি হ'ল এটি সম্ভব নয় foo(i++)কারণ এখন ইনক্রিমেন্টটি foo()বলা হওয়ার আগেই করা দরকার, তবে পুরানো মানটি পাস করা দরকার foo()। ফলস্বরূপ, সংকলক এর একটি অনুলিপি তৈরি করতে বাধ্য হয়i সংকলকটি মূলটিতে ইনক্রিমেন্ট অপারেটর কার্যকর করার আগে । অতিরিক্ত কনস্ট্রাক্টর / ডেস্ট্রাক্টর কলগুলি খারাপ অংশ।

উপরে উল্লিখিত হিসাবে, এটি মৌলিক ধরণের ক্ষেত্রে প্রযোজ্য নয়।

2. সামান্য পরিচিত ঘটনা: দ্রুত i++ হতে পারে

যদি কোনও কনস্ট্রাক্টর / ডেস্ট্রাক্টরকে ডেকে আনা প্রয়োজন না হয়, যা সর্বদা সি-তে ঘটে থাকে ++iএবং i++একইভাবে দ্রুত হওয়া উচিত, তাই না? না। তারা কার্যত সমান দ্রুত, তবে কিছু ছোট পার্থক্য থাকতে পারে, যা বেশিরভাগ অন্যান্য উত্তরদাতারা ভুল উপায়ে পেয়েছিলেন।

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


আপনার পয়েন্ট ২ সম্পর্কে: যদি ++iবা i++অন্য কোনও অভিব্যক্তির মধ্যে ব্যবহার করা হয়, তাদের মধ্যে পরিবর্তনগুলি অভিব্যক্তির শব্দার্থকে পরিবর্তন করে, সুতরাং কোনও সম্ভাব্য পারফরম্যান্স লাভ / ক্ষতি প্রশ্নবিদ্ধ নয়। যদি তারা স্বতন্ত্র থাকে, অর্থাৎ অপারেশনের ফলাফল অবিলম্বে ব্যবহার না করা হয় তবে কোনও শালীন সংকলক এটি একই জিনিসকে সংকলন করবে, উদাহরণস্বরূপ কোনও INCসমাবেশ নির্দেশ inst
শাহবাজ

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

4
@ শাহবাজ উদাহরণ হিসাবে: if(++foo == 7) bar();এবং কার্যত if(foo++ == 6) bar();সমতুল্য। যাইহোক, দ্বিতীয়টি একটি চক্র দ্রুত হতে পারে, কারণ তুলনা এবং বৃদ্ধি সিপিইউ দ্বারা সমান্তরালে গণনা করা যেতে পারে। এই একক চক্রটি খুব বেশি গুরুত্বপূর্ণ তা নয়, তবে পার্থক্য রয়েছে।
মাস্টার

1
ভাল যুক্তি. কনস্ট্যান্টগুলি প্রচুর পরিমাণে দেখায় (পাশাপাশি <উদাহরণস্বরূপ বনাম <=) যেখানে ++সাধারণত ব্যবহৃত হয়, তাই যদিও এর মধ্যে রূপান্তর প্রায়শই সহজেই সম্ভব।
শাহবাজ

1
আমি পয়েন্ট 2 পছন্দ করি, তবে এটি কেবল তখনই প্রয়োগ হয় যদি মানটি ব্যবহৃত হয়, ঠিক হয়? প্রশ্নটি বলছে "যদি ফলাফলের মানটি ব্যবহার না করা হয়?", সুতরাং এটি বিভ্রান্তিকর হতে পারে।
jinwee

7

@ মার্ক যদিও সংকলকটি ভেরিয়েবল এবং জিসিসি (সাম্প্রতিক সংস্করণগুলিতে) এর অস্থায়ী অনুলিপি (স্ট্যাক ভিত্তিক) অপ্টিমাইজ করার অনুমতি দিচ্ছে, তার অর্থ এই নয় যে সমস্ত সংকলক সর্বদা এটি করবে।

আমি এটি কেবল আমাদের বর্তমান প্রকল্পে যে সংকলকগুলি ব্যবহার করি তা দিয়ে পরীক্ষা করেছি এবং 4 টির মধ্যে 3 এটি অপ্টিমাইজ করে না।

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

আপনার কোডে অপারেটরগুলির মধ্যে একটির যদি সত্যিই নির্বোধ বাস্তবায়ন না হয়:

আলওয়াস i++ এর চেয়ে বেশি ++ পছন্দ করে।


শুধু কৌতূহল ... আপনি কেন একটি প্রকল্পে 4 টি পৃথক সি সংকলক ব্যবহার করেন? বা একটি দল বা একটি সংস্থায়, এই বিষয়ে?
লরেন্স ডল

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

5

সি-তে, ফলাফলটি অব্যবহৃত হলে সংকলক সাধারণত তাদের একই হতে পারে।

তবে, সি ++ এ যদি অন্য ধরণের ব্যবহার করেন যা তাদের নিজস্ব ++ অপারেটরগুলি সরবরাহ করে, উপসর্গ সংস্করণটি পোস্টফিক্স সংস্করণের চেয়ে দ্রুত হতে পারে। সুতরাং, আপনার যদি পোস্টফিক্স সিমানটিকসের প্রয়োজন না হয় তবে প্রিফিক্স অপারেটরটি ব্যবহার করা ভাল।


4

আমি এমন পরিস্থিতিতে ভাবতে পারি যেখানে উপসর্গের বর্ধনের তুলনায় পোস্টফিক্স ধীরে ধীরে:

কল্পনা করুন যে রেজিস্টার সহ একটি প্রসেসর 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;)।


4

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

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

এটি স্পষ্টতই একটি অত্যন্ত রহস্যজনক উদাহরণ, তবে পোস্ট-ইনক্রিমেন্ট যেখানে আরও দক্ষ ( সেখানে আমার বলা উচিত ছিল , যেহেতু আজকাল পিডিপি -11 সি কোডের খুব বেশি চাহিদা নেই)।


2
খুব রহস্যজনক, কিন্তু খুব আকর্ষণীয়!
মার্ক হ্যারিসন

@daShier। +1, যদিও আমি একমত নই, এটি তাত্পর্যপূর্ণ নয় বা কমপক্ষে এটি হওয়া উচিত নয়। সিডি ইউনিটসের সাথে 70 এর দশকের গোড়ার দিকে এটিডি ও টি বেল ল্যাবগুলিতে সম-বিকাশিত হয়েছিল যখন পিডিপি -11 টার্গেট প্রসেসর ছিল। এই যুগের পোস্ট ইনক্রিমেন্টের ইউনিক্স উত্স কোডে, "i ++" আংশিকভাবে প্রচলিত কারণ বিকাশকারীরা জানতেন যে কখন মূল্য নির্ধারিত হয়, "j = i ++", বা একটি সূচক হিসাবে ব্যবহৃত হয়েছিল, "a [i ++] = n", কোডটি কিছুটা দ্রুত হবে (এবং আরও ছোট)। দেখে মনে হচ্ছে তারা পূর্বের প্রয়োজন না পড়লে পোস্ট ইনক্রিমেন্ট ব্যবহার করার অভ্যাসে চলে গেছে। অন্যরা তাদের কোড পড়ে শিখেছে এবং এই অভ্যাসটিও গ্রহণ করেছে।
জিমহার্ক

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

2
@ জিমহার্ক, হ্যাঁ, আমি সেই পিডিপি -11 প্রোগ্রামারদের একজন যারা 68000 এ রূপান্তরিত হয়েছিল এবং এখনও ব্যবহার করে --iএবং i++
দাশির

2

আমি সবসময় প্রাক-বর্ধন পছন্দ করি, তবে ...

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

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

এছাড়াও, অপ্টিমাইজারকে কম করার সম্ভাবনা মানে কম্পাইলারটি দ্রুত চলে।


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

তিনি "যদি ফাংশনটি অন্তর্ভুক্ত হয়" বলে উল্লেখ করেন এবং এটি তার যুক্তিটিকে সঠিক করে তোলে।
ব্লেজারব্লেড

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

0

আমার সি কিছুটা মরিচা, তাই আগেই ক্ষমা চেয়ে নিচ্ছি। দ্রুতগতিতে, আমি ফলাফলগুলি বুঝতে পারি। তবে, আমি উভয় ফাইলই কীভাবে একই এমডি 5 হ্যাশ এ এসেছিল তা নিয়ে আমি বিভ্রান্ত। লুপের জন্য একটি একই চলতে পারে, তবে কি নিম্নলিখিত 2 টি লাইন কোড বিভিন্ন সমাবেশ তৈরি করে না?

myArray[i++] = "hello";

বনাম

myArray[++i] = "hello";

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

শুধু আমার দুই সেন্ট।


1
@ জেসন জেড কমপ্লেক্সটি অপ্টিমাইজেশানটি অ্যাসেম্বলি তৈরির কাজ শেষ হওয়ার আগে ঘটে যায়, এটি দেখতে পাবে যে আই ভেরিয়েবল একই লাইনে অন্য কোথাও ব্যবহৃত হয় না, সুতরাং এর মানটি রাখা একটি অপচয় হবে, এটি সম্ভবত কার্যকরভাবে এটি ++ এ ফ্লিপ করে। তবে এটি একটি অনুমান মাত্র। আমার একজন প্রভাষক এটির দ্রুত বলার চেষ্টা না করা পর্যন্ত আমি অপেক্ষা করতে পারছি না এবং আমি এমন লোক হতে পারি যিনি ব্যবহারিক প্রমাণ সহ কোনও তত্ত্ব সংশোধন করে। আমি ইতিমধ্যে প্রায় শত্রুতা অনুভব করতে পারি ^ _ ^
টার্কস

3
"আমার সি কিছুটা মরিচা, তাই আগেই ক্ষমা চাইছি।" আপনার সি-তে কোনও সমস্যা নেই, তবে আপনি মূল প্রশ্নটি পুরোটা পড়েন নি: " ফলাফলের মানটি ব্যবহার না করা হলে i ++ এবং ++ i এর মধ্যে পারফরম্যান্সের পার্থক্য রয়েছে কি ? " তির্যকটি নোট করুন। আপনার উদাহরণ, 'ফলাফল' আমি ++, / ++, আমি হয় ব্যবহৃত হয়েছে, কিন্তু লুপ জন্য কথ্য মধ্যে, প্রাক / postincrement অপারেটর 'ফলাফল' তাই কম্পাইলার কি করতে পারেন তা লেগেছে ব্যবহার করা হয় না।
রডি

2
আপনার উদাহরণে কোডটি আলাদা হবে কারণ আপনি মানটি ব্যবহার করছেন। উদাহরণটি যেখানে তারা একই ছিল কেবলমাত্র ইনক্রিমেন্টের জন্য ++ ব্যবহার করছিল, এবং কোনওটি দিয়ে ফেরানো মানটি ব্যবহার করছিল না।
জন গার্ডনার

1
ঠিক করুন: "সংকলকটি দেখতে পাবে যে i ++ এর রিটার্ন মান ব্যবহার করা হয়নি, সুতরাং এটি ++ i এ ফ্লিপ করবে"। আপনি যা লিখেছেন তাও ভুল কারণ আপনার আই +++ এর সাথে আমি একসাথে থাকতে পারি না, i++ একই লাইনে (বিবৃতি) থাকতে পারি, ফলাফলটি অপরিবর্তিত।
ব্লেজারব্লেড

1
পরিবর্তন foo[i++]করার জন্য foo[++i]অন্য কিছু পরিবর্তন স্পষ্টত প্রোগ্রাম শব্দার্থবিদ্যা পরিবর্তন হবে ছাড়া, কিন্তু একটি লুপ-উত্তোলন অপ্টিমাইজেশান যুক্তিবিজ্ঞান ছাড়া একটি কম্পাইলার ব্যবহার যখন কিছু প্রসেসরের উপর, বৃদ্ধিশীল pএবং qএকবার এবং তারপর একটি লুপ যা সঞ্চালিত যেমন চলমান *(p++)=*(q++);দ্রুততর একটি লুপ যা সঞ্চালিত ব্যবহার না করে হতে পারে *(++pp)=*(++q);। কিছু প্রসেসরের খুব কড়া লুপের জন্য গতির পার্থক্য তাত্পর্যপূর্ণ হতে পারে (10% এর বেশি), তবে এটি সম্ভবত সি এর একমাত্র ক্ষেত্রে যেখানে পোস্ট-ইনক্রিমেন্ট প্রাক-ইনক্রিমেন্টের তুলনায় বস্তুগতভাবে দ্রুত।
ক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.