Ich möchte wissen, wie stellen wir sicher, wenn eine mit register
Spezifizierer definierte Variable im CPU-Register gespeichert wurde?Wie kann sichergestellt werden, dass eine mit "register" angegebene Variable im CPU-Register gespeichert wurde?
Antwort
Grundsätzlich können Sie nicht. Es gibt absolut nichts in der C-Norm, die Sie die Kontrolle gibt.
Unter Verwendung des Schlüsselwort register
ein hint den Compiler dass dass die Variable vielleicht gespeichert in ein Register (das heißt erlaubt schnellstmöglichen Zugriff) gibt. Der Compiler kann sie ignorieren. Jeder Compiler kann den Hinweis auf andere Weise akzeptieren/ablehnen.
Zitiert C11
, Kapitel §6.7.1, (emphasis Mine)
Eine Erklärung eines Bezeichners für ein Objekt, mit Speicherklassen Spezifizierer
register
schlägt vor, die auf das Objekt zugreifen, wie so schnell wie möglich. Das Ausmaß, in dem solche Vorschläge wirksam sind, ist implementierungsdefiniert.
FWIW, die meisten heutigen Compiler können die meist verwendeten Variablen erfassen und sie in tatsächlichen Register zuweisen, , falls erforderlich. Denken Sie daran, CPU-Register ist eine knappe Ressource.
Den Code zerlegen und prüfen. Es mag an diesem Punkt nicht wirklich klar sein, denn Variablen existieren nicht wirklich, sie sind nur Namen, die Produzenten mit Konsumenten verbinden. Es ist also nicht unbedingt ein Register für diese Variable reserviert - vielleicht ist es ganz verschwunden, vielleicht lebt es in mehreren Registern während seiner Lebenszeit, vielleicht keiner der oben genannten.
Historisch wurde das Schlüsselwort register
vor Jahrzehnten als Optimierungshinweis für den Compiler eingeführt. Heutzutage, wenn die Prozessoren mehr allgemeine Register haben, platziert der Compiler Variablen normalerweise in Register, auch wenn es ihnen nicht mitgeteilt wird (wenn der Code mit Optimierungen kompiliert wird).
Nur ein Hinweis und keine Durchsetzung, Sie können nichts tun, um es zu erzwingen. Sie können diesen Teil des Codes jedoch in Assembler schreiben. Auf diese Weise haben Sie vollständige Kontrolle darüber, wo Ihre Variablen gespeichert sind.
Vielleicht ruft Montageanleitung wird dabei helfen:
/// Function must be something like this:
int check_register_storing()
{
__asm__ (
pushad // Save registers
and ebx, ebx // Set Zero
and eax, eax
and ecx, ecx
and edx, edx
);
// Set test number.
register int a = 8; // Initial value;
int from_register = 0;
asm(
add eax, ebx // If, 'a' variable set on CPU register,
add eax, ecx // Some of main usage registers must contain 8
add eax, edx // Others must contain 0
mov %from_register, eax
popad // Return default parameters to registers
}
/// Check result
printf("Original saved number: %d, Returned number from main registers: %d\n", a, from_register);
}
Wenn die Variable gespeichert ist, in ein Register bedeutet es nicht im Speicher gespeichert ist. Also, das Bullauge ist versuchen, die Adresse der Variablen mit printf zugreifen. Wenn die Ausgabe eine Adresse ergibt, ist die Schlussfolgerung, dass sie im Speicher gespeichert ist, so dass sie als automatische Speicherklassenvariable agieren würde (und sie wird nicht im Register gespeichert). Aber wenn es Fehler gibt "imkompatible implizite Deklaration der eingebauten Funktion 'printf'" .dies bedeutet, dass die Variable im Register gespeichert wird und sich als Registerspeicherklassenvariable verhalten würde.
- 1. Wie kann sichergestellt werden, dass @PreAuthorize definiert wurde?
- 2. Wie kann sichergestellt werden, dass Nachrichten zugestellt werden?
- 3. Wie kann sichergestellt werden, dass eine NSDecimalNumber keine Nachkommastellen darstellt?
- 4. Wie kann sichergestellt werden, dass eine Datei dauerhaft auf USB gespeichert wurde, wenn der Benutzer "Hardware sicher entfernen" nicht verwendet?
- 5. Wie kann sichergestellt werden, dass die in TestNG.xml angegebene Reihenfolge beibehalten wird?
- 6. Wie kann sichergestellt werden, dass der asynchrone Code ausgeführt wird, nachdem ein Stream verarbeitet wurde?
- 7. Wie kann sichergestellt werden, dass Benutzer korrekte Koordinatenwerte eingeben?
- 8. Wie kann sichergestellt werden, dass der Benutzer auf der Controller-Ebene im System angemeldet ist?
- 9. Wie kann sichergestellt werden, dass der Endpunkt eine Methode nicht ausführt, wenn sie bereits ausgeführt wird?
- 10. Kann sichergestellt werden, dass Anfragen von einer bestimmten Domain kommen?
- 11. Wie kann sichergestellt werden, dass eine Zeichenfolge nur Zeichen aus einer vordefinierten Liste akzeptierter Zeichen enthält?
- 12. Wie kann sichergestellt werden, dass eine Funktion nur eine positive Ganzzahl akzeptiert?
- 13. Wie wird sichergestellt, dass bestimmte JavaScript-Dateien zuerst geladen werden?
- 14. mciSendString kann nicht im Verzeichnispfad gespeichert werden
- 15. In MS C# Unit Testing, wie kann sichergestellt werden, dass eine ArgumentException aufgetreten ist?
- 16. Producer/Consumer, Wie kann sichergestellt werden, dass eine Thread Safe Queue leer ist, bevor alle Verbraucher ausgeschaltet werden?
- 17. Wie kann sichergestellt werden, dass der Zuweisungsoperator für eine virtuelle Basisklasse nur einmal aufgerufen wird?
- 18. Wie kann sichergestellt werden, dass eine generierte GUID global eindeutig ist?
- 19. Wie kann sichergestellt werden, dass eine Python-Funktion ihre Ausgabe nur anhand ihrer Eingabe generiert?
- 20. Wie kann sichergestellt werden, dass eine Operation auf Systemebene atomar ist? irgendein Muster?
- 21. Wie kann sichergestellt werden, dass eine Website für alle Bildschirmauflösungen geeignet ist?
- 22. CloudFront-Caching - Wie kann sichergestellt werden, dass CF-Aktualisierungen vom S3-Ursprungsserver nach Ablauf aktualisiert werden?
- 23. Adresse einer Variablen in einem Register gespeichert
- 24. Wie verhindere ich, dass Passwörter gespeichert werden?
- 25. Wie kann sichergestellt werden, dass zwischengespeicherte JavaScript- und CSS-Dateien erneut geladen werden?
- 26. Wie kann sichergestellt werden, dass die Serialisierung und Deserialisierung mit WebServices symmetrisch ist?
- 27. Wie kann Javascript-Variable zwischen Frames gespeichert werden?
- 28. Wie kann sichergestellt werden, dass Bilder in ein JQuery-Plugin geladen werden?
- 29. Wie kann sichergestellt werden, dass NodeJS nach fehlerhaften Anforderungen wiederhergestellt wird?
- 30. Kann Snapshot nicht im Datenmodell gespeichert werden?
Aufgrund Ihrer Verwendung der Vergangenheitsform interpretierte ich Ihre Frage so, dass ich "wie finde ich heraus, was der Compiler getan hat" statt "wie zwinge ich es zu etwas zu tun", aber es scheint niemand anders sah es so - Können Sie erklären, was Sie meinten? – harold
Code könnte 'int a; Register int b; int c; 'und dann prüfen, ob die Adressen von 'a, c' sequentiell sind. Natürlich ist dies nicht _prove_ 'b' in einem Register, aber es ist ein Hinweis, dass" b "in einem Register sein kann oder nicht. – chux