Template Argumente vs Funktion Argumente [geschlossen]

8

Was ist der Unterschied zwischen den folgenden 2 Teilen des Codes:

1:

%Vor%

2:

%Vor%

Was ist der Hauptanwendungsfall, um Template-Argumente anstelle von Funktionsargumenten zu verwenden? Warum nicht einfach das zweite Beispiel verwenden?

    
Victor Polevoy 04.02.2015, 13:11
quelle

3 Antworten

9
  

Was ist der Unterschied zwischen zwei Codeabschnitten?

Template-Argumente müssen Konstanten sein, die zur Kompilierzeit angegeben werden. Funktionsargumente sind Variablen und müssen zum Zeitpunkt der Kompilierung nicht bekannt sein.

Um zu veranschaulichen, mit der Vorlage:

%Vor%

während mit Funktionsargumenten:

%Vor%
  

Was ist der Hauptanwendungsfall, um Template-Argumente anstelle von Funktionsargumenten zu verwenden?

Da sie Konstanten sind, können sie eine bessere Optimierung ergeben und können in Situationen (wie der Größe eines Arrays) verwendet werden, in denen nur Konstanten zulässig sind.

  

Warum nicht einfach das zweite Beispiel verwenden?

In diesem Fall, warum nicht? Das wäre flexibler, da Sie die Argumente zur Laufzeit berechnen oder aus der Eingabe des Programms abrufen können. Wenn es inline ist, sollte es so effizient sein wie die Vorlage, wenn es mit konstanten Werten aufgerufen wird.

    
Mike Seymour 04.02.2015, 13:20
quelle
2

Der größte Unterschied ist, was Sie mit diesen beiden Funktionen tun können:

  • Die Template-Funktion hat ihre zwei Grenzen als Parameter der Vorlage, was bedeutet, dass sie zur Kompilierungszeit bekannt sein müssen
  • Die reguläre Funktion hat ihre zwei Grenzen als reguläre Parameter, was bedeutet, dass Sie Variablen für sie verwenden können.

Im Wesentlichen können Sie dies mit der zweiten Funktion tun

%Vor%

Dies ist mit der Template-Funktion nicht möglich:

%Vor%

Wenn alle Aufrufe konstante Parameter für die Limit-Parameter verwenden, können Sie mit der Template-Funktion einige zusätzliche CPU-Zyklen speichern, da der Compiler die Optimierung besser durchführen kann. Es ist schwer vorstellbar, dass diese zusätzlichen Zyklen einen bedeutenden Unterschied machen würden.

  

Warum nicht einfach das zweite Beispiel verwenden?

Es gibt Situationen, in denen Sie in Ihrer Funktion eine Kompilierzeitkonstante benötigen. Wenn Sie beispielsweise std::array<len> basierend auf einem der Parameter deklarieren möchten, muss dieser als Vorlagenparameter und nicht als regulärer Parameter übergeben werden:

%Vor%

Das gleiche würde mit normalen Funktionsparametern nicht funktionieren:

%Vor%     
dasblinkenlight 04.02.2015 13:20
quelle
1

Sie können die Vorlage nicht mit Werten aufrufen, die nicht consexpr sind.

Das einfachste Beispiel wäre etwa so:

1 Kann mit diesem Code aufgerufen werden:

%Vor%

Sie müssten 2 für Werte verwenden, die nur zur Laufzeit bekannt sind:

%Vor%     
Jonathan Mee 04.02.2015 13:25
quelle

Tags und Links