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

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