Wie mit Compiler Optimierungsprobleme zu bewältigen
-
10-07-2019 - |
Frage
Ich habe ein lästiges Problem mit meinem iPhone App. Jedes Mal, wenn ich die Optimierungsstufe auf etwas anderes als „None“ gesetzt, erhalte ich Berechnungsfehler. Dies geschieht nur in beim Bau für das iPhone SDK (das iPhone Simulator ist immer gut).
ich habe nichts dagegen, Optimierungen im Release-Modus zu deaktivieren, aber die Anwendung ist ein klein bisschen zu langsam, wenn ich das tun.
Die Anwendung ist komplex, so ist es schwer, den Teil zu finden, die zu aggressiv optimiert ist.
Ich denke, dass das Problem auf der GCC Seite ist, da es Problem der Optimierung des Codes für die ARM-Architektur zu haben scheint.
Gibt es eine Möglichkeit, um nur Optimierungen zu deaktivieren nur für bestimmten Teil des Codes? Wie würden Sie mit dieser Art von Problem umgehen?
Lösung
Ja, das ist durchaus möglich. GCC hat eine Attribut dass:
/* disable optimization for this function */
void my_function(void) __attribute__((optimize(0)));
void my_function(void) {
/* ... */
}
Legt die Optimierungsstufe für die Funktion -O0
. Sie können aktivieren / deaktivieren spezifische Optimierungen:
/* disable optimization for this function */
void my_function(void) __attribute__((optimize("no-inline-functions")));
void my_function(void) {
/* ... */
}
Andere Tipps
Wenn Optimierung Ihres Programms Verhalten ändert, könnten Sie unwissentlich auf undefiniertes oder die Implementierung definiert Verhalten angewiesen sein. Es könnte sich lohnen, einen genaueren Blick auf Ihren Code mit einem Auge in Richtung Annahmen über Variablen Werte und Ordnungen der Evaluierung.
Bitte überprüfen Sie richtig return
ing Werte aus Funktionen. Nach meiner Erfahrung funktioniert das folgende nur manchmal:
int myFunc()
{
x+7;
}
beachten Sie die absichtliche und unsichere Unterlassung des Rück Schlüsselwort
aufgrund des Registers wird in den Ausdruck Berechnung ist die gleiche wie die Rückkehr Register verwendet.
Wenn Optimierungen eingeschaltet sind, Nutzungsänderungen registrieren und die Funktion fehlschlägt zu tun, was Sie wollen.
Überprüfen Sie die Compiler-Warnungen.