Warum wird in einer Prozedur eine lokale Variable anstelle des var-Parameters verwendet?

8

oIn Delphi SysUtils ist eine Prozedur ScanBlanks :

%Vor%

Ich frage mich, warum die Prozedur I variable verwendet. Können wir nicht Pos var direkt verwenden?

%Vor%

Ist es wegen einer Geschwindigkeits- / Gedächtnisstrafe? Kann jemand Erfahrener mir den Grund / Unterschied erklären?

    
nfc1 14.02.2016, 21:37
quelle

2 Antworten

3

Abgesehen von der Leistung in gut geschriebenem Code gibt es keinen Unterschied zwischen den beiden Funktionen.

In schlecht geschriebenem Code gibt es jedoch einen großen Unterschied. Die Verwendung einer lokalen Variablen macht es viel einfacher, über die Korrektheit der Funktion nachzudenken. Es besteht die Möglichkeit, dass sich S und Pos im Speicher überschneiden. Möchten Sie vorhersagen, wie sich die Prozedur verhält, wenn Inc(Pos); den Inhalt oder die Länge der Zeichenfolge ändert?

Die Verwendung einer lokalen Variablen macht es einfach, genau zu sehen, was passieren wird. Ich würde sicherlich zustimmen, dass die Verwendung von S und Pos einen schrecklichen Missbrauch der Prozedur darstellen würde, aber das Verhalten der Prozedur sollte ihrer Spezifikation entsprechen. Daher sollte die Spezifikation solche Eingabewerte nicht zulassen oder die Prozedur sollte wie spezifiziert, selbst wenn solche Eingabewerte vorhanden sind. Es ist schwierig, genau zu wissen, was funktioniert und was nicht. Das Verfahren funktioniert in allen Fällen wie beschrieben.

    
hvd 14.02.2016 22:32
quelle
2

Die Dokumentation lautet:

  

Vermeiden Sie auch, String-Indizes als var-Parameter zu übergeben, da dies zu ineffizientem Code führt.

Aber ich glaube nicht, dass das immer stimmt. Bei einem einfachen Beispiel wird der Optimierer sein Bestes geben. Meiner Meinung nach ist dies eine Mikro-Optimierung, die Sie beim Schreiben Ihres Codes nicht stören sollte. Siehe Jeff Atwood :

  

Es ist einfach egal! Es ist einfach egal!

Sehen wir uns ein Beispiel an:

%Vor%

Und das kompiliert in Win32 zu:

StringIndexByVar:

%Vor%

StringIndexByLocal:

%Vor%

Soweit ich weiß, unterscheidet sich die String-Indizierung hier nicht, weil der Index in ebx geladen wird (markiert mit Pfeil 1). Das Inkrementieren des Schleifenzählers (Pfeil 2) erfordert einen Speicherzugriff, was jedoch nicht mit der Stringindexberechnung zusammenhängt.

    
ventiseis 22.02.2016 20:09
quelle

Tags und Links