Gibt es Fälle in denen eine Switchanweisung performanter als schlau genutze verschachtelte if..else Anweisungen sind?
-
switch Anweisung schrieb:
Wie muß ich mir eine Sprungtabelle intern vorstellen?
ein zeigerarray

switch Anweisung schrieb:
Von wo weiß das Programm, wo es hinspringen soll, wenn z.B. case Z: ausgelöst werden soll?
bei array+z steht die adresse, an der es weiter geht

switch Anweisung schrieb:
Wie genau wird switch(c) ausgewertet?
kommt auf deinen compiler und die verwendeten werte an, am besten keine bzw. mögl. kleine lücken lassen

-
King George schrieb:
switch Anweisung schrieb:
Wie muß ich mir eine Sprungtabelle intern vorstellen?
ein zeigerarray

Ok.
Aber wie weiß das Programm, an welche Adresse es springen soll, also welcher Zeiger relevant wird?
Siehe nächster Punkt:switch Anweisung schrieb:
Von wo weiß das Programm, wo es hinspringen soll, wenn z.B. case Z: ausgelöst werden soll?
bei array+z steht die adresse, an der es weiter geht

Ist Z ein nummerischer Wert?
Oder wie meinst du das, Array mit Z addieren?
switch Anweisung schrieb:
Wie genau wird switch(c) ausgewertet?
kommt auf deinen compiler und die verwendeten werte an, am besten keine bzw. mögl. kleine lücken lassen

Was meinst du mit Lücken?
-
switch Anweisung schrieb:
Ist Z ein nummerischer Wert?
ja, also bei mir schon. sonst fällt die sprungtabellen optimierung raus.(eig. stimmt es nicht ganz, aber das geht jetzt zu weit...)
switch Anweisung schrieb:
Was meinst du mit Lücken?
case 1: case 2: //<<lücke case 4:
-
King George schrieb:
switch Anweisung schrieb:
Ist Z ein nummerischer Wert?
ja, also bei mir schon. sonst fällt die sprungtabellen optimierung raus.(eig. stimmt es nicht ganz, aber das geht jetzt zu weit...)
Wann wäre Z kein nummerischer Wert?
switch Anweisung schrieb:
Was meinst du mit Lücken?
case 1: case 2: //<<lücke case 4:Ok, verstehe, aber wenn Z ein nummerischer Wert ist und es in meinem Programm nur
case A
case M
und
case Zgeben würde, dann würden die 3 Zeichen doch einfach ab 0 bis 2 durchnummeriert werden, oder?
Das Problem mit Lücken trifft also nur bei Zahlen im case Teil auf, richtig?
-
switch Anweisung schrieb:
Wann wäre Z kein nummerischer Wert?
In den meisten Sprachen darf das Argument einer switch Anweisung sowieso nur ein numerischer Wert sein.
switch Anweisung schrieb:
Ok, verstehe, aber wenn Z ein nummerischer Wert ist und es in meinem Programm nur
case A
case M
und
case Zgeben würde, dann würden die 3 Zeichen doch einfach ab 0 bis 2 durchnummeriert werden, oder?
Meinst Du 'A', 'M' und 'Z'? Auch dies sind numerische Werte, nur als ASCII-Zeichen ausgedrückt. Hier könnte eine Sprungtabelle mit 256 Einträgen erstellt werden, won denen 253 einfach hinter die switch-Anweisung verzweigen.
-
switch-case funktioniert (zumindest in C und C++) nur mit numerischen Datentypen (auch char ist numerisch ;)).
Ansonsten:
Beim switch wird der Compiler vermutlich eine Umrechnung suchen, die deine case-Labels möglichst kompakt (und eindeutig) auf den Bereich 0..n abbildet. Damit baut er dann ein Array, wo an Position f(x) die Adresse der Anweisung hinter dem "case x:" steht. Lücken in den Labels dürften da höchstens etwas Speicherplatz verbrauchen, aber effektiv brauchst du nur eine Umrechnung und einen Sprung, um im richtigen Zweig zu landen.
Bei der if-else Kaskade müssen wirklich alle Bedingungen der Reihe nach abgefragt werden, bis eine davon erfüllt wurde, bei deiner Konstruktion (ohne else in den inneren Blocks) sogar alle Abfragen, selbst wenn du weißt, daß sie gar nicht mehr benötigt werden.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum C++ (auch C++0x, bzw. C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Was hat das Thema in C++ zu suchen?
Switch und if..else sind ein Programmierkonzept, darauf zielt auch die Frage ab und hat nur eingeschränkt etwas mit C++ zu tun.
-
Falsches Forum schrieb:
Was hat das Thema in C++ zu suchen?
Switch und if..else sind ein Programmierkonzept, darauf zielt auch die Frage ab und hat nur eingeschränkt etwas mit C++ zu tun.
Das Optimierungspotential und die Implementierung sind aber von der Sprache abhängig! Ein switch in C# kann mit string umgehen. In C++ ist das nicht möglich.
-
jkljkljkl schrieb:
Falsches Forum schrieb:
Was hat das Thema in C++ zu suchen?
Switch und if..else sind ein Programmierkonzept, darauf zielt auch die Frage ab und hat nur eingeschränkt etwas mit C++ zu tun.
Das Optimierungspotential und die Implementierung sind aber von der Sprache abhängig! Ein switch in C# kann mit string umgehen. In C++ ist das nicht möglich.
Ja und? Also sind wir dann einfach bei der Frage, ob die Strings dann nummerisch sind.
-
Ich glaube er meinte sowas wie Duff's Device.