Является x + = 1 более эффективным, чем x = x + 1?

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

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

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

Ответ 1

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

Ответ 2

Чтобы дать вам пример "реального мира", рассмотрите эту программу:

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

Ответ 3

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

Это не так.

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

Это не так.


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

Ответ 4

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

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

Приращение: x ++ vs x + = 1

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

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

Ответ 5

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

Ответ 6

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

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