Oddział Multiway - Multiway branch
Gałąź typu Multiway to zmiana w przepływie kontroli programu na podstawie wartości pasującej do wybranych kryteriów. Jest to forma instrukcji warunkowej . Odgałęzienie wielodrogowe jest często najbardziej wydajną metodą przekazywania kontroli do jednego z zestawu etykiet programu , zwłaszcza jeśli wcześniej utworzono indeks z surowych danych .
Przykłady
- Tabela rozgałęzień
- Instrukcja Switch - zobacz także alternatywy poniżej
- Wysyłka wielokrotna - w której wywoływany jest podprogram i następuje zwrot
Alternatywy
Wielodrożną gałąź można często zastąpić wydajnym przeszukiwaniem tabeli indeksowanej (przy użyciu samej wartości danych lub obliczonej pochodnej wartości danych jako indeksu tablicy )
„ … implementacja instrukcji switch została zrównana z implementacją instrukcji switch z wieloma ścieżkami. Jednak w przypadku wielu zastosowań instrukcji switch w rzeczywistym kodzie można całkowicie uniknąć rozgałęzień i zastąpić przełącznik jednym lub kilkoma wyglądami tabeli -ups. Na przykład
Has30Days
przykład [przedstawiony wcześniej] można zaimplementować w następujący sposób: [C przykład] "
„A Superoptimizer Analysis of Multiway Branch Code Generation” autorstwa Rogera Anthony'ego Sayle'a
switch (x) { /* x is month no */
case 4: /* April */
case 6: /* June */
case 9: /* September */
case 11: /* November */
return true;
}
można zastąpić przy użyciu techniki „bezpiecznego mieszania” -
unsigned int t = x | 2;
switch (t) {
case 6:
case 11:
return true;
}
lub można go zastąpić, używając wyszukiwania tabeli mapowania indeksu , z -
x %= 12; /* to ensure x is in range 0-11*/
static const int T[12] ={0,0,0,0,1,0,1,0,0,1,0,1}; /* 0-based table 'if 30 days =1,else 0' */
return T[x]; /* return with boolean 1 = true, 0=false */
(ze względu na prostotę tego drugiego przypadku byłoby lepiej zaimplementować go w linii, ponieważ narzut używania wywołania funkcji może być większy niż samo wyszukiwanie indeksowane).
Cytaty
Wielokierunkowe rozgałęzianie to ważna technika programowania, która zbyt często jest zastępowana nieefektywną sekwencją testów if. Peter Naur niedawno napisał mi, że uważa użycie tabel do sterowania przepływem programów za podstawową ideę informatyki, która została prawie zapomniana; ale spodziewa się, że lada dzień będzie gotowy do ponownego odkrycia. Jest to klucz do wydajności wszystkich najlepszych kompilatorów, które studiowałem.
- Donald Knuth , Structured Programming, przejdź do instrukcji
Zobacz też
Bibliografia
Linki zewnętrzne
- Kodowanie oddziałów wielodrogowych przy użyciu niestandardowych funkcji skrótu opracowanych przez HG Dietza
- Nauka Pythona przez Marka Lutza
- Programowanie w C ++ Autor: Nell B. Dale, Chip Weems
- A Superoptimizer Analysis of Multiway Branch Code Generation by Roger Anthony Sayle