Der Versuch, die gcc-Option -fomit-frame-pointer zu verstehen

 C Programming >> C-Programmierung >  >> Tags >> GCC
Der Versuch, die gcc-Option -fomit-frame-pointer zu verstehen


Ich habe Google gebeten, mir die Bedeutung von gcc zu geben Option -fomit-frame-pointer , was mich zur folgenden Anweisung weiterleitet.



Nach meinem Wissen über jede Funktion wird ein Aktivierungsdatensatz im Stapel des Prozessspeichers erstellt, um alle lokalen Variablen und einige weitere Informationen zu speichern. Ich hoffe, dieser Rahmenzeiger bedeutet die Adresse des Aktivierungsdatensatzes einer Funktion.


Was sind in diesem Fall die Art von Funktionen, für die der Rahmenzeiger nicht in einem Register gehalten werden muss? Wenn ich diese Informationen bekomme, werde ich versuchen, die neue Funktion basierend darauf zu entwerfen (wenn möglich), denn wenn der Frame-Zeiger nicht in Registern gehalten wird, werden einige Anweisungen in Binärform weggelassen. Dies wird die Leistung in einer Anwendung mit vielen Funktionen wirklich merklich verbessern.


Antworten:


Die meisten kleineren Funktionen benötigen keinen Rahmenzeiger - größere Funktionen KÖNNEN einen benötigen.


Es geht wirklich darum, wie gut der Compiler nachvollziehen kann, wie der Stack verwendet wird und wo sich Dinge auf dem Stack befinden (lokale Variablen, Argumente, die an die aktuelle Funktion übergeben werden, und Argumente, die für eine Funktion vorbereitet werden, die aufgerufen werden soll). Ich denke nicht, dass es einfach ist, die Funktionen zu charakterisieren, die einen Frame-Zeiger benötigen oder nicht benötigen (technisch gesehen MUSS KEINE Funktion einen Frame-Zeiger haben - es ist eher ein Fall von "wenn der Compiler es für notwendig hält, die Komplexität zu reduzieren von anderer Code").


Ich denke nicht, dass Sie als Teil Ihrer Codierungsstrategie "versuchen sollten, Funktionen ohne Frame-Zeiger zu machen" - wie ich schon sagte, einfache Funktionen brauchen sie nicht, also verwenden Sie -fomit-frame-pointer , und Sie erhalten ein weiteres Register für den Registerzuordner und sparen 1-3 Anweisungen zum Ein- / Aussteigen in Funktionen. Wenn Ihre Funktion einen Frame-Zeiger benötigt, liegt das daran, dass der Compiler entscheidet, dass dies eine bessere Option ist, als keinen Frame-Zeiger zu verwenden. Es ist kein Ziel, Funktionen ohne Frame-Zeiger zu haben, es ist ein Ziel, Code zu haben, der sowohl korrekt als auch schnell funktioniert.


Beachten Sie, dass "keinen Frame-Zeiger" eine bessere Leistung bringen sollte, aber es ist kein Wundermittel, das enorme Verbesserungen bringt - insbesondere nicht auf x86-64, das zu Beginn bereits 16 Register hat. Auf 32-Bit-x86, da es nur 8 Register hat, von denen eines der Stapelzeiger ist, und die Aufnahme eines anderen als Frame-Zeiger bedeutet, dass 25% des Registerplatzes belegt sind. Das auf 12,5 % zu ändern, ist eine ziemliche Verbesserung. Natürlich hilft auch das Kompilieren für 64-Bit sehr.