Um eine Seite schmutzig zu machen (Einschalten des schmutzigen Bits im Seitentabelleneintrag), berühre ich die ersten Bytes der Seite wie folgt:
pageptr[0] = pageptr[0];
In der Praxis ignoriert gcc die Aussage jedoch durch Eliminierung des toten Speichers. Um zu verhindern, dass gcc es optimiert, schreibe ich die Anweisung wie folgt neu:
volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;
Es scheint, dass der Trick funktioniert, aber etwas hässlich. Ich würde gerne wissen, ob es Direktiven oder Syntax gibt, die den gleichen Effekt haben. Und ich möchte keine -O0
Flagge verwenden, da dies auch eine große Leistungsstrafe mit sich bringt.
-O0
die "Optimierung" von totem Code nicht verhindert hat. Wenn GCC beispielsweise feststellt, dass Code keinen Effekt hat, wird er einfach entfernt. AFAIK das ist schon eine Etappe-O0
... Aber das ist nur meine ErfahrungAntworten:
Das Deaktivieren der Optimierung behebt das Problem, ist jedoch nicht erforderlich. Eine sicherere Alternative besteht darin, es für den Compiler illegal zu machen, den Speicher mithilfe des Typqualifizierers zu optimieren
volatile
.Das
volatile
Typqualifikationsmerkmal weist den Compiler an, die Speicher und Ladevorgänge streng zu speichern. Ein Zweck vonvolatile
besteht darin, den Compiler darüber zu informieren, dass der Speicherzugriff Nebenwirkungen hat und daher beibehalten werden muss. In diesem Fall hat der Speicher den Nebeneffekt, dass ein Seitenfehler verursacht wird, und Sie möchten, dass der Compiler den Seitenfehler beibehält.Auf diese Weise kann der umgebende Code weiterhin optimiert werden, und Ihr Code kann auf andere Compiler übertragen werden, die die GCCs
#pragma
oder die__attribute__
Syntax nicht verstehen .quelle
volatile
bedeutet, dass der Speicherzugriff wie geschrieben erfolgen muss, was genau das ist, was wir wollen. Mit anderen Worten, wir haben sorgfältig darüber nachgedacht, und es bedeutet, was wir denken, dass es bedeutet.Sie können verwenden
Optimierungen seit GCC deaktivieren 4.4.
Weitere Informationen finden Sie in der GCC-Dokumentation.
quelle
Anstatt die neuen Pragmas zu verwenden, können Sie sie auch
__attribute__((optimize("O0")))
für Ihre Bedürfnisse verwenden. Dies hat den Vorteil, dass nur eine einzelne Funktion und nicht alle in derselben Datei definierten Funktionen angewendet werden.Anwendungsbeispiel:
quelle
-Olevel
Option verwende, aber die einzelnen Optionen verwendet habe, die separat aktiviert werden? (In meinem Fall kann ich nicht feststellen, welche individuelle Optimierungsoption den Code bricht) .