2016-04-29 4 views
4

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?

+1

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

+0

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

Antwort

8

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.

4

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.

1

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.

0

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); 

}

1

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.

Verwandte Themen