2009-04-02 4 views
2

Ich habe einen C++ Code, der viel Rekursion beinhaltet. Ich denke, Register-Klasse für meine Variablen zu verwenden. Glauben Sie, indem Sie, damit ich Stapelspeicher werden zu sparen und die LeistungRegistervariablen

Dank

Sameer

Antwort

8

Ich könnte darauf wetten, dass der Compiler Ihre Anfrage NICHT berücksichtigt. Angenommen, Sie haben eine lokale Variable und rufen die Funktion rekursiv 100 Mal auf. Wenn es all Ihre Auto-Variablen 'register' Schlüsselwort würde es erfordern 100 Hardware-Register nur für diese Variable (alle Variablen sind am 100. Anruf am Leben)

Leistung ist ein schwieriges Problem. Analysieren Sie, wo das Programm wirklich Zeit verbringt und versuchen Sie, es zu optimieren, aber seien Sie vorsichtig: Einige Entscheidungen können ohne Gewinn enden, andere können zu schlechteren Ergebnissen führen. Wie bereits erwähnt, sind Compiler wirklich gut in dem, was sie tun. Das Erzwingen einer Variablen in einem Register bedeutet ein Register weniger für den Rest der zu verwendenden Variablen.

6

Keine verbessern, ich glaube, es wahrscheinlich überhaupt keine Wirkung haben wird. Moderne Compiler sind typischerweise viel besser darin, die Registerbenutzung zu planen als Menschen und ignorieren wahrscheinlich das Schlüsselwort "register".

Der einzige wirkliche Weg, um herauszufinden, ist, etwas Code zu schreiben und seine Leistung mit dem Schlüsselwort register und ohne es zu messen - die Änderung des Codes ist trivial.

1

Sie können Ihren Algorithmus ändern, um nur std::stack und einige benutzerdefinierte Klasse zu verwenden, die den Status des Algorithmus anstelle von Funktionsstapel und Rekursionsaufruf enthalten.

+0

Dies wird die Leistung nicht verbessern, aber es wird deutlich Stapelüberlauf Probleme reduzieren. –

1

Wenn ich mich richtig erinnere, garantiert das Register-Schlüsselwort nicht, dass die Variable in einem Register gespeichert wird, aber anzeigt, dass es könnte und wenn möglich ein Register verwenden sollte. Wenn ein Register nicht verfügbar ist, wird es trotzdem enden auf dem Stapel.

Microsoft C++ ignoriert das Schlüsselwort und trifft eigene Entscheidungen. Ich würde auf Ihren Algorithmus zuerst nach Leistungsgewinnen suchen.

0

Es ist 100%, bis der Compiler Ihre register Anfrage erfüllt. Sicher, Sie könnten Stapelspeicherplatz sparen, wenn Sie es schaffen, eine oder zwei lokale Variablen in Register zu pressen, aber (natürlich) nicht, wenn diese Werte über Aufrufe hinweg erhalten bleiben müssen, dann müssen sie wieder auf den Stapel gelegt werden.

+0

Gibt es eine Möglichkeit herauszufinden, ob der Compiler die Anfrage nach Registervariablen angenommen hat? –

+0

@sameer: ​​analysieren Sie die Assembly, aber das ist keine triviale Aufgabe, wenn die Methoden komplex sind –