Во-первых, предварительное увеличение только на потенциально быстрее по указанной вами причине.Но для базовых типов, таких как указатели, на практике это не так, потому что компилятор может генерировать оптимизированный код.Ссылка Есть ли разница в производительности между i ++ и ++ i в C ++? для получения более подробной информации.
Во-вторых, для достойного оптимизирующего компилятора нет разницы между двумя упомянутыми вами альтернативами.Весьма вероятно, что в обоих случаях будет сгенерирован один и тот же точный машинный код (если только вы не отключили оптимизации).
Чтобы проиллюстрировать это: на моем компиляторе следующий код генерируется, когда оптимизации отключены:
# c = *temp++;
movq temp(%rip), %rax
leaq 1(%rax), %rdx
movq %rdx, temp(%rip)
movzbl (%rax), %eax
movb %al, c(%rip)
# c = *temp;
movq temp(%rip), %rax
movzbl (%rax), %eax
movb %al, c(%rip)
# ++temp;
movq temp(%rip), %rax
addq $1, %rax
movq %rax, temp(%rip)
Обратите внимание, что в последнем есть дополнительная инструкция movq
, которая может учитывать более медленное время выполнения.
Однако, при включении оптимизации это превращается в:
# c = *temp++;
movq temp(%rip), %rax
leaq 1(%rax), %rdx
movq %rdx, temp(%rip)
movzbl (%rax), %eax
movb %al, c(%rip)
# c = *temp;
# ++temp;
movq temp(%rip), %rax
movzbl (%rax), %edx
addq $1, %rax
movq %rax, temp(%rip)
movb %dl, c(%rip)
Кромедругой порядок инструкций и выбор использования addq
против leaq
для приращения, между этими двумя нет реальной разницы.Если вы do получаете (измеримо) различную производительность между этими двумя, то это, вероятно, связано с конкретной архитектурой процессора (возможно, более оптимальным использованием конвейера, например.).