Нет никакой разницы между этими фрагментами.Они генерируют точно такую же сборку :
pub fn a(bytes: &[u8]) -> usize {
for (i, item) in bytes.iter().enumerate() {
if *item == b' ' {
return i;
}
}
0
}
pub fn b(bytes: &[u8]) -> usize {
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return i;
}
}
0
}
pub fn c(bytes: &[u8]) -> usize {
for (i, item) in bytes.iter().enumerate() {
if item == &b' ' {
return i;
}
}
0
}
playground::a:
negq %rsi
movq $-1, %rax
.LBB0_1:
leaq (%rsi,%rax), %rcx
cmpq $-1, %rcx
je .LBB0_2
cmpb $32, 1(%rdi,%rax)
leaq 1(%rax), %rax
jne .LBB0_1
retq
.LBB0_2:
xorl %eax, %eax
retq
; The code is identical so we just call the existing function
playground::b:
jmp playground::a@PLT
; The code is identical so we just call the existing function
playground::c:
jmp playground::a@PLT
Для чего бы это ни стоило, я написал бы функцию как
pub fn a(bytes: &[u8]) -> Option<usize> {
bytes.iter().position(|&b| b == b' ')
}
iter()
[...] ссылка на элемент, найденный в bytes
Да, iter
обычно является функцией, которая возвращает итератор ссылок.
Мне нужно либо сравнить между
Как правило, вам нужно сравнивать две вещи с одинаковым количеством ссылок или иногда с одним уровнем разности ссылок.То, как вы этого достигнете, не имеет значения - ссылка на значение или разыменование другого, или разыменование с помощью *
в качестве выражения или с помощью &
в шаблоне.
См. Также: