Ответ 1
В большинстве компиляторов они были бы идентичны
В x = x + 1
, выполняется x
дважды? Если это так, означает ли это в x += 1
, x
оценивается только один раз? Как два выражения оцениваются в терминах промежуточного кода компилятора?
Например, x++
может означать: выберите местоположение x
, загрузите содержимое x
в регистр и увеличьте значение x
в памяти.
Также я прочитал, что x += 1
полезен, когда x
не является простой переменной, а выражением, включающим массив. Любые идеи, почему это так?
В большинстве компиляторов они были бы идентичны
Чтобы дать вам пример "реального мира", рассмотрите эту программу:
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
Почему x + = 1 эффективнее, чем x = x + 1?
Это не так.
Почему x ++ эффективнее, чем x + = 1?
Это не так.
Причина предпочтения x += 1
- x = x+1
возникает, когда x
заменяется гораздо более длинным идентификатором или, возможно, полем в классе или структуре. В этой ситуации версия x += 1
более читаема и, что еще важнее, позволяет избежать ошибок повторения себя.
Итак, есть уже некоторые вопросы, которые охватывают то, что вы спрашиваете здесь:
Что быстрее? ++, + = или x + 1?
Суть в том, что в большинстве, но не во всех языках компилятор все равно сделает их одинаковыми, поэтому нет никакой разницы в эффективности. Вопросы, приведенные выше, содержат подробные сведения по этому вопросу.
С помощью gcc вы можете получить код ассемблера с помощью gcc -S foo.c
. Я пробовал его с помощью x += 1
и x = x + 1
, и это было то же самое.
Поскольку для записи требуется не более 4 символов, а не 5.
Это единственный способ, в котором x+=1
"более эффективен", чем x=x+1
. Однако оператор +=
имеет несколько других преимуществ, например, тот факт, что (x)+=1
работает в макросах, где x
- это выражение, которое может иметь побочные эффекты, которые вы хотите избежать оценки более одного раза...