Gibt es eine Leistung, die durch die Übertragung der Speicherzuordnung lokal in eine Mitgliedsfunktion in seine Klasse gewonnen werden soll?

StackOverflow https://stackoverflow.com/questions/2956097

Frage

Angenommen, ich habe die folgende C ++ - Klasse:

class Foo
{
  double bar(double sth);
};

double Foo::bar(double sth)
{
  double a,b,c,d,e,f
  a = b = c = d = e = f = 0;
  /* do stuff with a..f and sth */
}

Die Funktionsleiste () wird in einer Schleife Millionen Mal bezeichnet. Offensichtlich müssen jedes Mal, wenn es aufgerufen wird, die Variablen a..f zugeteilt werden. Werde ich eine Leistung erzielen, indem ich die Variablen a..F -Mitglieder der FOO -Klasse mache und sie nur am Eingangspunkt der Funktion initialisiert? Andererseits werden die Werte von A..F durch diese->->, also frage ich mich, ob es sich nicht tatsächlich um eine mögliche Leistungsverschlechterung handelt. Gibt es einen Overhead für den Zugriff auf einen Wert über einen Zeiger? Vielen Dank!

War es hilfreich?

Lösung

Der Zugang zu Stack-zuallozierten Variablen ist schneller als für Klassenmitglieder. Stapelvariablen werden unter Verwendung eines Stapelzeigers ohne einen Klassenzeiger derenferenziert. Fügen Sie nur neue Klassenmitglieder hinzu, wenn dies durch den Programmalgorithmus erforderlich ist. Initialisieren Sie Stapelvariablen direkt in der Deklaration:

Doppel a = 0,0, b = 0,0 ...

Andere Tipps

Bei allen Architekturen weiß ich, dass die Zuteilung/Deallokation von Einbauten durchgeführt wird, indem das Stapelregister manipuliert wird. Ich nehme an, dass dies im Vergleich zum Rest der Funktion fast keine Zeit dauert.

Wenn Sie der Meinung sind, dass die Inkrementierung/Verringerung eines Wertes in einem Prozessorregister hilfreich sein könnte, sind Sie auf Mikrooptimierungen zurückzuführen. Sie sollten als letztes vor dem Versand gemacht werden und (als alle Optimierungen) sollten sie von geleitet werden Messung, nicht durch Erraten.

Wenn die Variablen wirklich lokal zur Funktion sind und nirgendwo anders verwendet werden, sollten sie lokal zur Funktion sein. Ich kann nicht sehen, wie sie die Leistung erhöhen werden. Sie sollten jedoch eher die Initialisierung als die Zuordnung verwenden:

double a = 0, b = 0, c = 0, d = 0, e = 0, f = 0;

Dies kann für Doppels von Bedeutung sein oder nicht, aber sicherlich für benutzerdefinierte Typen wie Zeichenfolgen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top