Вот внутренние циклы, составленные GCC. Я просто добавил restrict
ключевые слова, удалил возвращаемое значение и скомпилировал 32-битную версию для Core 2:
Первый, версия массива:
.L3:
movzbl (%edi,%edx), %ecx
addl $1, %eax
cmpl %ebx, %eax
movb %cl, (%esi,%edx)
movl %eax, %edx
jne .L3
Второй, инкрементная версия:
.L9:
movzbl (%edx), %ebx
addl $1, %ecx
addl $1, %edx
movb %bl, (%eax)
addl $1, %eax
cmpl %ecx, %esi
ja .L9
Компилятор, как вы можете видеть, просматривал обе конструкции.