Ursprünglich haben C-Compiler nur geschachtelte if/else erzeugt. Diese Variante funktioniert immer und der passende Code-Generator ist einfach.
Ein grosser Nachteil ist das Laufzeitverhalten bei vielen Labels, um an das letzte Label zu gelangen müssen alle if abgearbeitet werden.
Allerdings haben diese dummen Compiler die Labels nicht sortiert, man konnte nachhelfen indem man die case entsprechend ihrer Wahrscheinlichkeit sortiert hat. Der Code war dann nicht unbedingt wirklich übersichtlicher.
Man darf nicht vergessen, dass in der Zeit als C entstand Hauptspeicher noch in Kilobyte und damalige Festplatten in Megabyte gemessen wurden.
Etwas später hat man dann angefangen die Labels zuerst zu analysieren.
Bei nur ein paar Label erzeugt man immer noch geschachtelte if/else, der Code-Overhead ist kleiner und die Laufzeitdifferenzen spielen auch keine Rolle.
Für Sprungtabellen ist es am einfachsten wenn die case-Werte feste Abstände haben. Bei nur einzelnen fehlenden Werten, werden diese einfach in der Tabelle eingeführt und zeigen auf das default-Label.
Bei einer zufälligen Verteilung der Werte bleibt dann nur noch die Möglichkeit eine Suchtabelle, welche wieder das selbe laufzeitverhalten wie verschachtelte if/else hat.
Bei der Frage nach dem Stack-Handling in C++ ist zu Bedenken, dass C++ ursprünglich als Pre-Prozessor konzipiert wurde. Im ersten Schritt wurde C++ einfach in ein C-Programm übersetzt und dann ging es mit dem normalen C-Compiler weiter.
Normalerweise kann man den C++-Compiler anweisen eine Datei mit diesem C-Code zu erstellen.
Dieser Schritt über C ist auch der Grund für die decorated names in C++. Es musste eine Lösung gefunden werden, damit C-Compiler und Linker mit identischen Funktions-Namen aber unterschiedlichen Parametern umgehen können. Also bastelt man sich aus den Parameter-Typen eine Codierung zusammen und bastelt diese an den Funktionsnamen dran. Für C und den Linker sind dies dann komplett unterschiedliche Funktionen.
MfG Peter(TOO)
Lesezeichen