Является ли x + = 1 более эффективным, чем x = x + 1? - PullRequest
10 голосов
/ 19 сентября 2011

В x = x + 1, x оценивается дважды?Если это так, означает ли это, что в x += 1, x оценивается только один раз?Как два выражения оцениваются с точки зрения промежуточного кода компилятора?

Например, x++ может означать: взять местоположение x, загрузить содержимое x в регистр и увеличить значение x в памяти.

Также я прочитал, что x += 1 полезен, когда x не простая переменная, а выражение, включающее массив.Есть идеи, почему это так?

Ответы [ 6 ]

14 голосов
/ 19 сентября 2011

Просто, чтобы привести пример из реальной жизни, рассмотрим следующую программу:

int main()
{
    int i = 0;
    i += 1;
    i++;
    i = i + 1;
    return 0;
}

Компиляция с помощью GCC в Darwin 11 со следующими флагами:

  • -S останов в ассемблере
  • -m32 для 32-битной платформы, просто для упрощения

Будет сгенерирована следующая программа, за исключением комментариев и пустых строк, которые я добавил. Посмотрите специально в комментариях.

        .section        __TEXT,__text,regular,pure_instructions
        .globl  _main
        .align  4, 0x90
_main:
        pushl   %ebp              # cdecl function stuff
        movl    %esp, %ebp        #
        subl    $12, %esp         # get room for variables    
        movl    $0, -12(%ebp)     # i = 0;

        ; i += 1
        movl    -12(%ebp), %eax   # load i in register a
        addl    $1, %eax          # add 1 to register a
        movl    %eax, -12(%ebp)   # store it back in memory

        ; i++
        movl    -12(%ebp), %eax   #
        addl    $1, %eax          # just the same
        movl    %eax, -12(%ebp)   #

        ; i = i + 1
        movl    -12(%ebp), %eax   #
        addl    $1, %eax          # just the same
        movl    %eax, -12(%ebp)   #

        movl    $0, -8(%ebp)
        movl    -8(%ebp), %eax
        movl    %eax, -4(%ebp)
        movl    -4(%ebp), %eax
        addl    $12, %esp
        popl    %ebp
        ret

.subsections_via_symbols
12 голосов
/ 19 сентября 2011

В большинстве компиляторов они будут идентичны

7 голосов
/ 19 сентября 2011

Почему х + = 1 более эффективен, чем х = х + 1?

Это не так.

Почему x ++ эффективнее, чем x + = 1?

Это не так.


Причина предпочтения x += 1 вместо x = x+1 возникает, когда x заменяется гораздо более длинным идентификатором или, возможно, полем в классе или структуре. В этой ситуации версия x += 1 более читабельна и, что еще важнее, позволяет избежать ловушек повторения.

3 голосов
/ 19 сентября 2011

Итак, уже есть несколько вопросов, которые охватывают то, что вы здесь задаете:

x = x + 1 против x + = 1

Увеличение: x ++ против x + = 1

Что быстрее? ++, + = или x + 1?

Суть в том, что в большинстве , но не во всех языках компилятор все равно сделает их идентичными, так что нет никакой разницы в эффективности. Приведенные выше вопросы подробно раскрывают эту тему.

0 голосов
/ 19 сентября 2011

Поскольку для записи требуется 4 символа, а не 5.

Это единственный способ, которым x+=1 "более эффективен", чем x=x+1. Однако у оператора += есть несколько других преимуществ, например, тот факт, что (x)+=1 работает в макросах, где x - это выражение, которое может иметь побочные эффекты, которые вы хотите избегать оценки более одного раза ...

0 голосов
/ 19 сентября 2011

С помощью gcc вы можете получить код ассемблера с помощью gcc -S foo.c. Я попробовал это с x += 1 и x = x + 1, и это было то же самое.

...