Heim >Backend-Entwicklung >C++ >Wie kann ich eine Switch-Anweisung in C für nicht ganzzahlige Konstanten effizient implementieren?

Wie kann ich eine Switch-Anweisung in C für nicht ganzzahlige Konstanten effizient implementieren?

DDD
DDDOriginal
2024-12-03 11:07:09974Durchsuche

How Can I Efficiently Implement a Switch Statement in C   for Non-Integer Constants?

Implementieren einer Switch-Anweisung für nicht ganzzahlige Konstanten in C: Entrollen der binären Suche mit Vorlagen und Makros

Die klassische Switch-Anweisung in C ist bekannt für seine Effizienz bei der Auswahl von Aktionen basierend auf ganzzahligen Werten. Die Einschränkung, nur ganze Zahlen zu verwenden, kann jedoch beim Umgang mit nicht ganzzahligen Konstanten zu Herausforderungen führen.

Das Problem: Langsame und komplexe Alternativen

Ein Ansatz besteht darin, a zu verwenden Eine Reihe von if-Anweisungen kann jedoch ineffizient und schwer zu pflegen sein. Die Verwendung von Datenstrukturen wie Karten zum Zuordnen von Zeichenfolgen zu Ganzzahlen könnte zu zusätzlicher Komplexität und Codierungsaufwand führen.

Schnelle und sortierte Binärsuche mit Makros und Vorlagen

Um eine schnelle, Saubere und einfache Implementierung, man kann Makro- und Vorlagenmagie nutzen. Die Bibliothek fastmatch.h bietet eine makrobasierte Lösung, die im Wesentlichen eine binäre Suche zur Kompilierungszeit ausführt. Die Syntax ähnelt einer Switch-Anweisung:

NEWMATCH
MATCH("asd")
  some c++ code
MATCH("bqr")
  ... the buffer for the match is in _buf
MATCH("zzz")
  ...  user.YOURSTUFF 
/*ELSE 
  optional
*/
ENDMATCH(xy_match)

Dies generiert eine Funktion xy_match, die eine binäre Suche in den bereitgestellten Fällen durchführt. Die Pausen sind implizit und die Syntax ist sortiert.

Update: C 11 Lambdas und Initialisierungslisten für mehr Eleganz

Mit C 11 stellen Lambdas und Initialisierungslisten eine Elegantere Lösung:

#include <utility>
#include <algorithm>
#include <initializer_list>

template <typename KeyType, typename FunPtrType, typename Comp>
void Switch(const KeyType &value, std::initializer_list<std::pair<const KeyType, FunPtrType>> sws, Comp comp) {
  // ... implementation omitted for brevity
}

Dieser Ansatz verwendet eine Lambda-Funktion zum Vergleichen von Werten und eine untere Grenze Algorithmus zur Suche nach dem richtigen Fall.

Update 2016: Versuch zur Kompilierungszeit für unsortierte Fälle

Für unsortierte Fallzweige nutzt eine erweiterte Lösung den Versuch zur Kompilierungszeit Generation in der C11-Metaprogrammierung. Die Implementierung ist in der cttrie-Bibliothek auf GitHub verfügbar.

Durch die Nutzung des erweiterten Codegenerators des Compilers optimiert dieser Ansatz den Suchprozess erheblich und bietet eine Leistung, die mit einer Switch-Anweisung vergleichbar ist, die Ganzzahlen als Eingabe erfordern würde.

Das obige ist der detaillierte Inhalt vonWie kann ich eine Switch-Anweisung in C für nicht ganzzahlige Konstanten effizient implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn