Чтобы проиллюстрировать смысл использования индексов вместо указателей, см. эту реализацию хеш-таблицы , которая использует (короткие) индексы int, сохраняя несколько ценных битов.Функция tiny_find () компилируется в эту сборку (GCC -O2):
.globl tiny_find
.type tiny_find, @function
tiny_find:
.LFB57:
.cfi_startproc
imull $98765, %edi, %ecx
movl $274877907, %edx
movl %ecx, %eax
mull %edx
movl $-1, %eax
shrl $6, %edx
imull $1000, %edx, %edx
subl %edx, %ecx
movzwl %cx, %ecx
movzwl table+4(,%rcx,8), %edx
cmpw $-1, %dx
je .L12
movzwl %dx, %eax
testb $1, table+7(,%rax,8)
jne .L19
jmp .L13
.p2align 4,,10
.p2align 3
.L21:
movzwl table+4(,%rax,8), %eax
cmpw $-1, %ax
je .L20
movzwl %ax, %eax
testb $1, table+7(,%rax,8)
je .L13
.L19:
cmpl table(,%rax,8), %edi
jne .L21
.L13:
movzbl table+6(,%rax,8), %eax
.L12:
rep
ret
.p2align 4,,10
.p2align 3
.L20:
movl $-1, %eax
ret
.cfi_endproc
.LFE57:
.size tiny_find, .-tiny_find
Внутренний цикл (обход списка ссылок) является частью между L21 и L13.Я бы не сказал, что код неэффективен.