Funktionsüberlastung (mindestens normal) hat keinen Einfluss auf die Ausführungsgeschwindigkeit. Überlegen Sie, ob Sie diese Funktionen wie schrieb:
void print_int(int); // takes an integer argument
void print_double(double); // takes a floating-point argument
void print_string(string); // takes a string argument
... und dann Dinge ausgedruckt von einem von ihnen die Wahl auf das, was Sie drucken wollten. Das ist ziemlich genau das, was der Compiler macht: Er nimmt die Anzahl und den Typ der Parameter und codiert sie in einen "entstellten" Namen. Wenn Sie einen Funktionsaufruf ausführen, durchsucht der Compiler (zur Kompilierungszeit) die verfügbaren Funktionen, wählt einen aus und erstellt einen Aufruf für diese Funktion. Der Code zum Aufrufen der Funktion ist identisch mit dem Code zum Aufrufen einer Funktion, die nicht überlastet wurde.
Die Auswahl der besten Funktion ist eine nicht-triviale Übung, um es milde auszudrücken. Es findet in einigen Phasen statt. Der erste besteht darin, einen Bereich zu finden, in dem etwas definiert mit dem Namen, den Sie verwendet haben. Die zweite besteht darin, alles in diesem Bereich mit diesem Namen zu durchsuchen, um eine Liste von Überladungen zu erstellen.
Der nächste Schritt ist die Beseitigung von Überlastungen, die überhaupt nicht funktionieren könnten - z. B. Überladungen, die die Anzahl der Argumente, die Sie übergeben haben, einfach nicht akzeptieren können. Wenn nur eine Funktion übrig bleibt, wird die Überladungsauflösung ausgeführt. Wenn es mehr als einen gibt, kommen wir zum letzten (und schwierigsten) Teil der Überladungsauflösung.
Der Compiler beginnt mit einer Liste möglicher impliziter Konvertierungen für jeden Typ und einer Rangfolge für jeden Typ. Das "Beste" ist die Identitätskonvertierung (d. H. Keine Konvertierung, z. B. wenn Sie eine int
übergeben und die Funktion eine int
erwartet). Etwas schlechter (aber immer noch ziemlich gut) ist etwas wie das Hinzufügen einer const
. Irgendwann kommen Sie zu Dingen wie das Abschneiden eines Doppels zu einem int
.
Der Compiler durchläuft dann nacheinander Argumente und untersucht die Konvertierung, die erforderlich ist, um von diesem Argument zum Typ für den formalen Parameter zu gelangen. Um als "beste" Überladung zu gelten und zur Verwendung ausgewählt zu werden, muss mindestens ein Argument eine bessere Konvertierung als die Konvertierung für jede andere Überladung haben, und keines der Argumente kann eine schlechtere als die Überlast haben würde für jede andere Überladung benötigt.
Wenn es so etwas nicht gibt (zB haben Sie nur zwei brauchbare Funktionen, und jede hat einen Parameter, der eine bessere Umwandlung hat, und ein Argument mit einer schlechteren Umwandlung), ist der Aufruf nicht eindeutig, so kann der Code nicht kompilieren.
Der Compiler betrachtet die Anzahl und Typen von Funktionsargumenten und wählt die Funktionsimplementierung aus, die dieser entspricht, oder wenn keine vorhanden ist [Beispiel avg (int1, int2, int3, int4), wobei keine definiert ist] gibt eine Fehlermeldung aus . –
Wie für 1: Keine Laufzeitleistungsdifferenz für Ihr Programm. Und wahrscheinlich kein/unbedeutender Unterschied für die Kompilierzeit. Wie für 2: Es ist viel hinter den Kulissen da, also sei bereit für ein tiefes Lesen ... –
Auch für 2: Wenn ich mich richtig erinnere erklärte STL es in seinem [Core C++] (https: // channel9) recht gut .msdn.com/Series/C9-Vorträge-Stephan-T-Lavavej-Core-C-/Core-Cpp-10) Videos (Link ist zum letzten Video in der Serie, da sie anscheinend keine Playlist-Funktion haben , die anderen Videos sind in der Beschreibung verlinkt). –