c++ কোনটি দ্রুত চালানো হবে, যদি(পতাকা== 0) অথবা যদি(0== পতাকা)?




জাতীয় পতাকার বিবর্তন (13)

GCC 4.1.2 এর সাথে amd64 এর জন্য একই কোড:

        .loc 1 4 0  # int f = argc;
        movl    -20(%rbp), %eax
        movl    %eax, -4(%rbp)
        .loc 1 6 0 # if( f == 0 ) {
        cmpl    $0, -4(%rbp)
        jne     .L2
        .loc 1 7 0 # return 0;
        movl    $0, -36(%rbp)
        jmp     .L4
        .loc 1 8 0 # }
 .L2:
        .loc 1 10 0 # if( 0 == f ) {
        cmpl    $0, -4(%rbp)
        jne     .L5
        .loc 1 11 0 # return 1;
        movl    $1, -36(%rbp)
        jmp     .L4
        .loc 1 12 0 # }
 .L5:
        .loc 1 14 0 # return 2;
        movl    $2, -36(%rbp)
 .L4:
        movl    -36(%rbp), %eax
        .loc 1 15 0 # }
        leave
        ret

সাক্ষাৎকার প্রশ্নঃ কোনটি দ্রুত কার্যকর করবে, if (flag==0) অথবা if (0==flag) ? কেন?


Answer #1

অন্যরা বলেছে, কোন পার্থক্য নেই।

0 মূল্যায়ন করা হয়েছে। flag মূল্যায়ন করা হয়েছে। এই প্রক্রিয়া একই সময় লাগে, কোন ব্যাপার তারা স্থাপন করা হয়।

সঠিক উত্তর হবে: তারা একই গতি উভয়।

এমনকি if(flag==0) অভিব্যক্তি if(flag==0) এবং if(0==flag) অক্ষর একই পরিমাণ আছে! যদি তাদের মধ্যে একজনের মতো লেখা হয় if(flag== 0) , তাহলে কম্পাইলারটির বিশদ বিশিষ্ট একটি অতিরিক্ত স্থান থাকবে, তাই কম্পাইল সময়টি নির্দেশ করার জন্য আপনার বৈধ কারণ থাকবে।

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


Answer #2

প্রস্তাবিত উপায়ে ব্যবহার করে দুটি সহজ প্রোগ্রাম তৈরি করুন।

কোড একত্রিত করা। সমাবেশে তাকান এবং আপনি বিচার করতে পারেন, কিন্তু আমি সন্দেহ করি একটি পার্থক্য আছে!

সাক্ষাত্কার আগের তুলনায় কম হচ্ছে।


Answer #3

সন্দেহ যখন এটি benchmark এবং সত্য শিখতে।


Answer #4

শুধু একটি সরাইয়া হিসাবে (আমি আসলে মনে করি যে কোনও উপযুক্ত কম্পাইলার এই প্রশ্নটিকে জাগিয়ে তুলবে, যেহেতু এটি এটি অপটিমাইজ করবে) 0 == ফ্ল্যাগের উপর ফ্ল্যাগ ব্যবহার করে == 0 টাইপোটি টাইপ করে যেখানে আপনি এটি ভুলে গেছেন = (যদি আপনি দুর্ঘটনাক্রমে টাইপ করেন) পতাকা = 0 এটি কম্পাইল হবে, কিন্তু 0 = পতাকা হবে না), যা আমি মনে করি প্রত্যেকটি ভুল এক মুহুর্তে বা অন্য দিকে তৈরি হয়েছে ...


Answer #5

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

উত্তর:

flag এর ধরন কি?

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

flag একটি অন্তর্নির্মিত হয়, তাহলে উভয় একই গতি নিতে হবে।

x86উইকিপিডিয়া নিবন্ধ থেকে, আমি if বিবৃতির জন্য Jxx নির্দেশের জন্য বাজি ধরতে পারি: সম্ভবত একটি JNZ (জিরো জিরো না জিরো) বা কিছু সমতুল্য।

আমি কম্পাইলার যেমন একটি সুস্পষ্ট অপ্টিমাইজেশান মিস্ অনুপস্থিত, এমনকি অপ্টিমাইজেশান বন্ধ বন্ধ। এই ধরনের জিনিস যা পিপহোল অপ্টিমাইজেশান জন্য ডিজাইন করা হয়।

সম্পাদনা করুন: আবার স্পঞ্জ, তাই আসুন কিছু সমাবেশ যোগ করুন (এলএলভিএম 2.7 আইআর)

int regular(int c) {
  if (c == 0) { return 0; }
  return 1;
}

int yoda(int c) {
  if (0 == c) { return 0; }
  return 1;
}

define i32 @regular(i32 %c) nounwind readnone {
entry:
  %not. = icmp ne i32 %c, 0                       ; <i1> [#uses=1]
  %.0 = zext i1 %not. to i32                      ; <i32> [#uses=1]
  ret i32 %.0
}

define i32 @yoda(i32 %c) nounwind readnone {
entry:
  %not. = icmp ne i32 %c, 0                       ; <i1> [#uses=1]
  %.0 = zext i1 %not. to i32                      ; <i32> [#uses=1]
  ret i32 %.0
}

এমনকি যদি কেউ আইআরটি পড়তে না জানে, তবে আমি মনে করি এটি স্ব-ব্যাখ্যামূলক।


Answer #6

নির্বাহ গতি গতি শর্তে কোন পার্থক্য। অবস্থা একই ভাবে উভয় ক্ষেত্রে মূল্যায়ন করা প্রয়োজন।


Answer #7

আমি মনে করি সেরা উত্তর "এই ভাষা কোন উদাহরণ"?

প্রশ্নটি ভাষাটি নির্দিষ্ট করে নি এবং এটি 'সি' এবং 'সি ++' উভয়ই ট্যাগ করেছে। একটি সুনির্দিষ্ট উত্তর আরও তথ্যের প্রয়োজন।

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


Answer #8

ওয়েল, আমি ব্যায়াম অনুরোধের জন্য, ওপিকে মন্তব্যের সাথে সম্পূর্ণভাবে একমত হয়েছি:

যদি কম্পাইলার যথেষ্ট চতুর না হয় (অবশ্যই আপনি এটি ব্যবহার করতে না পারেন) বা অপ্টিমাইজেশান নিষ্ক্রিয় করা হয়, তাহলে x == 0 একটি jump if zero নির্দেশে কম্পাইল করতে পারে jump if zero নির্দেশ থাকে, 0 == x আরও জেনেরিক (এবং ব্যয়বহুল) হতে পারে। সংখ্যাসূচক মান তুলনা।

তবুও, আমি এই পদে চিন্তা করে এমন একজন বসের জন্য কাজ করতে চাই না ...


Answer #9

একেবারে কোন পার্থক্য আছে।

অ্যাসাইনমেন্ট / তুলনা টাইপস বিলুপ্তির উল্লেখ করে আপনি ইন্টারভিউ প্রশ্নটির উত্তর দেওয়ার জন্য পয়েন্টগুলি অর্জন করতে পারেন, যদিও:

if (flag = 0)  // typo here
   {
   // code never executes
   }

if (0 = flag) // typo and syntactic error -> compiler complains
   {
   // ...
   }

এটি সত্য হলেও, যেমন একটি সি-কম্পাইলার প্রাক্তন ( flag = 0 ) ক্ষেত্রে সতর্ক করে দেয়, পিএইচপি, পার্ল বা জাভাস্ক্রিপ্টে কোনও সতর্কবার্তা নেই বা <insert language here>


Answer #10

পতাকা একটি ব্যবহারকারী সংজ্ঞায়িত টাইপ যখন ভাল একটি পার্থক্য আছে

struct sInt
{
    sInt( int i ) : wrappedInt(i)
    {
        std::cout << "ctor called" << std::endl;
    }

    operator int()
    {
        std::cout << "operator int()" << std::endl;
        return wrappedInt;
    }

    bool operator==(int nComp)
    {
        std::cout << "bool operator==(int nComp)" << std::endl;
        return (nComp == wrappedInt);
    }

    int wrappedInt;
};

int 
_tmain(int argc, _TCHAR* argv[])
{
    sInt s(0);

    //in this case this will probably be faster
    if ( 0 == s )
    {
        std::cout << "equal" << std::endl;
    }

    if ( s == 0 )
    {
        std::cout << "equal" << std::endl;
    }
}

প্রথম ক্ষেত্রে (0 == গুলি) রূপান্তর অপারেটর বলা হয় এবং তারপরে ফেরত ফলাফলটি 0 এর সাথে তুলনা করা হয়। দ্বিতীয় ক্ষেত্রে = = অপারেটর বলা হয়।


Answer #11

একেবারে কোন পার্থক্য গতি-বুদ্ধিমান হবে। কেন সেখানে থাকা উচিত?


Answer #12

তারা গতি পদে ঠিক একই হতে হবে।

লক্ষ্য করুন যে, কিছু লোক সমানতা তুলনায় বাম দিকে ধ্রুবক তুলনা করতে ব্যবহার করে (তথাকথিত "Yoda শর্তাবলী") যদি আপনি == (সমতা তুলনা অপারেটর) = (সমতা তুলনা অপারেটর ); যেহেতু আক্ষরিক অর্থে নির্ধারিত একটি সংকলন ত্রুটি ট্রিগার করে, এই ধরনের ভুল এড়াতে হয়।

if(flag=0) // <--- typo: = instead of ==; flag is now set to 0
{
    // this is never executed
}

if(0=flag) // <--- compiler error, cannot assign value to literal
{

}

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

if(flag=0) // <--- warning: assignment in conditional expression
{

}




c