Wiemy, że Duff's device korzysta z przeplotu struktury przełącznika fallthrough i pętlę jak:Duff w Swift
send(to, from, count)
register short *to, *from;
register count;
{
register n = (count + 7)/8;
switch (count % 8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while (--n > 0);
}
}
Teraz w Swif 2.1 switch-case control flows nie niejawnie mieć fallthrough jak czytamy w Swift docs:
Nie niejawny fallthrough
w przeciwieństwie do oświadczenia przełącznika w C i Objective-C, przełączyć oświadczenia w Swift nie robić t domyślnie przechodzi przez dno każdego przypadku i do następnego. Zamiast tego cała instrukcja przełącznika kończy działanie, gdy tylko pierwsza dopasowana skrzynka przełączników zakończy się , bez konieczności stosowania wyraźnej instrukcji break. Dzięki temu instrukcja jest bezpieczniejsza i łatwiejsza w użyciu niż w C, dzięki czemu omyłkowo unika się wykonywania przez przypadek więcej niż jednego przypadku przełącznika.
Teraz, biorąc pod uwagę, że istnieje fallthrough klauzula jawnie mają fallthrough efekt uboczny w SWIFT:
fallthrough
oświadczenia przełącznika w Swift nie wchodzą przez dno każdorazowo i do następnego. Zamiast tego, cała instrukcja switch kończy jego wykonanie zaraz po zakończeniu pierwszego pasującego przypadku. W przypadku kontrastu , C wymaga wstawienia wyraźnej instrukcji break na końcu każdego przełącznika , aby zapobiec przewracaniu. Unikanie wartości domyślnych: "fallthrough" oznacza, że instrukcje przełączników Swift są znacznie bardziej zwięzłe, i przewidywalne niż ich odpowiedniki w C, a przez to unikają przypadkowego błędnego wykonania wielu przypadków przełączeń.
że jest dość dużo jak:
let integerToDescribe = 5
var description = "The number \(integerToDescribe) is"
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
description += " a prime number, and also"
fallthrough
default:
description += " an integer."
}
print(description)
// prints "The number 5 is a prime number, and also an integer."
zważywszy, że jak Wikipedia przypomina nam, urządzenia wychodzi z emisji
A straightforward code to copy items from an array to a memory-mapped output register might look like this:
do { /* count > 0 assumed */
*to = *from++; /* "to" pointer is NOT incremented, see explanation below */
} while(--count > 0);
która byłaby dokładna realizacja Urządzenie Duffa w Swift?
To jest tylko język & pytanie kodowania, nie jest przeznaczony do stosowania w rzeczywistych aplikacji Swift.
fallthrough jest istotnym aspektem urządzenia Duffa. Bez tego nie sądzę, aby w Swift istniała dokładna implementacja. W Swift nie można nawet symulować upadku w instrukcji Switch, więc zamiast tego musiałbyś użyć serii "if then". Chyba nie ma sensu. –
Eh ... to jest optymalizacja z 1983 roku. Rzeczy, takie jak wspomnienia pamięci podręcznej i prognozy rozgałęzień, zostały zaledwie wymyślone, nie mówiąc już o wysoce zoptymalizowanych implementacjach 'memcpy'. Dlaczego optymalizujesz kod zgodnie z algorytmem z lat 80. i dlaczego uważasz, że takie rzeczy są nadal aktualne? – Lundin
to tylko pytanie o kodowanie/język, a nie realna implementacja czegoś, co powinno być aktualne dzisiaj. – loretoparisi