В GCC 4.4.3 для x86, с или без оптимизаций, они компилируются с точно таким же кодом сборки и, следовательно, занимают столько же времени для выполнения.Как вы можете видеть в сборке, GCC просто конвертирует n++
в n=n+1
, а затем оптимизирует его в дополнение к одной инструкции (в -O2).
Предложение вашего инструктора, что n++
быстрееприменимо только к очень старым неоптимизирующим компиляторам, которые не были достаточно умны, чтобы выбрать инструкции по обновлению на месте для n = n + 1
.Эти компиляторы устарели в мире ПК в течение многих лет, но все еще могут быть найдены для странных проприетарных встроенных платформ.
C код:
int n;
void nplusplus() {
n++;
}
void nplusone() {
n = n + 1;
}
Выходная сборка (без оптимизации):
.file "test.c"
.comm n,4,4
.text
.globl nplusplus
.type nplusplus, @function
nplusplus:
pushl %ebp
movl %esp, %ebp
movl n, %eax
addl $1, %eax
movl %eax, n
popl %ebp
ret
.size nplusplus, .-nplusplus
.globl nplusone
.type nplusone, @function
nplusone:
pushl %ebp
movl %esp, %ebp
movl n, %eax
addl $1, %eax
movl %eax, n
popl %ebp
ret
.size nplusone, .-nplusone
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
Выходная сборка (с оптимизацией -O2):
.file "test.c"
.text
.p2align 4,,15
.globl nplusplus
.type nplusplus, @function
nplusplus:
pushl %ebp
movl %esp, %ebp
addl $1, n
popl %ebp
ret
.size nplusplus, .-nplusplus
.p2align 4,,15
.globl nplusone
.type nplusone, @function
nplusone:
pushl %ebp
movl %esp, %ebp
addl $1, n
popl %ebp
ret
.size nplusone, .-nplusone
.comm n,4,4
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits