Para los índices de matriz y la aritmética de puntero, los tipos que son del mismo tamaño que un puntero (normalmente, size_t y ptrdiff_t) pueden ser mejores, ya que evitan la necesidad de cero o firmar extender el registro. Considere
float onei(float *a, int n)
{
return a[n];
}
float oneu(float *a, unsigned n)
{
return a[n];
}
float onep(float *a, ptrdiff_t n)
{
return a[n];
}
float ones(float *a, size_t n)
{
return a[n];
}
con GCC 4.4 O2 en x86_64 se genera el siguiente asm:
.p2align 4,,15
.globl onei
.type onei, @function
onei:
.LFB3:
.cfi_startproc
movslq %esi,%rsi
movss (%rdi,%rsi,4), %xmm0
ret
.cfi_endproc
.LFE3:
.size onei, .-onei
.p2align 4,,15
.globl oneu
.type oneu, @function
oneu:
.LFB4:
.cfi_startproc
mov %esi, %esi
movss (%rdi,%rsi,4), %xmm0
ret
.cfi_endproc
.LFE4:
.size oneu, .-oneu
.p2align 4,,15
.globl onep
.type onep, @function
onep:
.LFB5:
.cfi_startproc
movss (%rdi,%rsi,4), %xmm0
ret
.cfi_endproc
.LFE5:
.size onep, .-onep
.p2align 4,,15
.globl ones
.type ones, @function
ones:
.LFB6:
.cfi_startproc
movss (%rdi,%rsi,4), %xmm0
ret
.cfi_endproc
.LFE6:
.size ones, .-ones
Como puede verse, las versiones con la int e índice unsigned int (onei y oneu) requiere un extra instrucción (movslq/mov) para firmar/extender cero el registro.
Como se mencionó en un comentario, la desventaja es que codificar un registro de 64 bits requiere más espacio que la parte de 32 bits, lo que aumenta el tamaño del código. En segundo lugar, las variables ptrdiff_t/size_t necesitan más memoria que el equivalente int; si tiene tales matrices, ciertamente puede afectar el rendimiento mucho más que el beneficio relativamente pequeño de evitar la extensión de cero/signo. Si no está seguro, perfil!
Los contadores de iteración no deben estar en la memoria caché de la CPU; deberían residir en registros. –
1. Creo que los compiladores arreglan automáticamente muchas de esas cosas para usted. 2. ¿Por qué no escribes un programa que prueba el rendimiento entre los dos? – Shahbaz
seguro, pero "pero no sé si en la máquina de 64 bits cada número de 32 bits debe extenderse a 64 bits antes de cualquier uso". Y eso fue solo un ejemplo. –