2016-01-25 9 views
8

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.

+0

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. –

+4

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

+0

to tylko pytanie o kodowanie/język, a nie realna implementacja czegoś, co powinno być aktualne dzisiaj. – loretoparisi

Odpowiedz

1

Możesz wyrazić swoje zamiary w najwyższym możliwym poziomie i zaufać kompilatorowi Swift, aby zoptymalizować go dla siebie, zamiast próbować zoptymalizować go samemu. Swift to język wysokiego poziomu. Nie rozwijasz pętli niskiego poziomu w języku wysokiego poziomu.

W szczególności w Swift nie musisz martwić się kopiowaniem tablic (oryginalna aplikacja Urządzenia Duffa), ponieważ Swift udaje, że kopiuje tablicę za każdym razem, gdy ją przypiszesz, używając "copy on write". Oznacza to, że będzie używać tej samej tablicy dla dwóch zmiennych, o ile tylko z nich czytasz, ale gdy tylko zmodyfikujesz jedną z nich, utworzy duplikat w tle.

Na przykład, od https://developer.apple.com/documentation/swift/array Modyfikowanie kopii tablic

Each array has an independent value that includes the values of all 
of its elements. For simple types such as integers and other structures, 
this means that when you change a value in one array, the value of that 
element does not change in any copies of the array. For example: 

var numbers = [1, 2, 3, 4, 5] 
var numbersCopy = numbers 
numbers[0] = 100 
print(numbers) 
// Prints "[100, 2, 3, 4, 5]" 
print(numbersCopy) 
// Prints "[1, 2, 3, 4, 5]"