Oddział wielokierunkowy
Gałąź wielokierunkowa to zmiana w przepływie sterowania programu w oparciu o wartość odpowiadającą wybranym kryteriom. Jest to forma instrukcji warunkowej . Gałąź wielokierunkowa jest często najskuteczniejszą metodą przekazywania sterowania do jednego z zestawów etykiet programu , zwłaszcza jeśli wcześniej utworzono indeks z surowych danych .
Przykłady
- Stół oddziałowy
- Instrukcja switch — patrz także alternatywy poniżej
- Wielokrotna wysyłka - gdzie wywoływany jest podprogram i następuje zwrot
Alternatywy
Wielokierunkową gałąź można często zastąpić wydajnym indeksowanym wyszukiwaniem w tabeli (wykorzystując samą wartość danych lub obliczoną pochodną wartości danych jako indeks tablicy )
„ …implementacja instrukcji switch została zrównana z implementacją rozgałęzienia wielokierunkowego. Jednak w przypadku wielu zastosowań instrukcji switch w prawdziwym kodzie możliwe jest całkowite uniknięcie rozgałęzień i zastąpienie przełącznika jednym lub kilkoma wyglądami tabeli -ups. Na przykład przykład
Has30Days
[przedstawiony wcześniej] można zaimplementować w następujący sposób: [przykład C]"
„Analiza superoptymalizatora generowania wielokierunkowego kodu rozgałęzienia” autorstwa Rogera Anthony'ego Sayle'a
switch ( x ) { /* x to numer miesiąca */ przypadek 4 : /* kwiecień */ przypadek 6 : /* czerwiec */ przypadek 9 : /* wrzesień */ przypadek 11 : /* listopad */ return true ; }
można zastąpić, stosując technikę „bezpiecznego mieszania”, z -
int bez znaku t = x | 2 ; switch ( t ) { przypadek 6 : przypadek 11 : zwróć prawdę ; }
lub można go zastąpić, używając przeszukiwania tabeli mapowania indeksu , za pomocą -
00000000
x %= 12 ; /* upewnienie się, że x mieści się w zakresie 0-11*/ static const int T [ 12 ] = { , , , , 1 , , 1 , , , 1 , , 1 }; /* tabela oparta na 0 'if 30 dni = 1, else 0' */ return T [ x ]; /* powrót z wartością logiczną 1 = prawda, 0 = fałsz */
(ze względu na prostotę tego drugiego przypadku byłoby lepiej zaimplementować go w linii, ponieważ narzut związany z użyciem wywołania funkcji może być większy niż samo wyszukiwanie indeksowane).
Cytaty
Rozgałęzienia wielokierunkowe to ważna technika programowania, która zbyt często jest zastępowana nieefektywną sekwencją testów if. Peter Naur napisał mi niedawno, że uważa wykorzystanie tabel do kontrolowania przebiegu programu 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 we wszystkich najlepszych kompilatorach, które studiowałem.
— Donald Knuth , Programowanie strukturalne z przejściem do instrukcji
Zobacz też
Linki zewnętrzne
- Kodowanie gałęzi wielokierunkowych przy użyciu niestandardowych funkcji skrótu autorstwa HG Dietza
- Nauka Pythona Mark Lutz
- Programowanie w C++ Nell B. Dale, Chip Weems
- Analiza superoptymalizatora generowania wielokierunkowego kodu rozgałęzienia autorstwa Rogera Anthony'ego Sayle'a