Frage

Ich habe so etwas wie diese

register unsigned int a, b, c;
int n;
for (n = 0; n < 10; ++n){
c = a + b
b = a
a = c
array[n] = c;
}

, was es tut, spielt es keine Rolle. Der Code läuft schnell, wie es jetzt ist, langsamer, wenn das Schlüsselwort register entfernt wird. Allerdings, wenn ich im Register vor int hinzufügen n, es tatsächlich läuft langsamer als jetzt, aber schneller, als wenn keine Register verwendet wird.

Kann jemand erklären mir dies? Danke.

War es hilfreich?

Lösung

register gibt den Compiler einen Hinweis die Variable in einem Register zu platzieren, anstatt Speicher / Stapelspeicher. In einigen Fällen wird es nicht genügend Register für jede Variable, die Sie dieses Schlüsselwort setzen auf, so dass es zu viele Variablen setzen wieder einige der anderen aus Registern erzwingen.

Dies ist nur ein Hinweis, aber, und der Compiler muss nicht, es nehmen.

Andere Tipps

Wie haben Sie dieses Mal? In der Praxis tut register in der Regel nichts. Es ist ein Stück von cruft aus, wenn Compiler-Technologie war äußerst primitiv und Compiler kann nicht Registerzuweisung selbst herausfinden. Es sollte ein Hinweis sein, ein Register zu dieser Variablen zuzuweisen und war nützlich für die Variablen sehr häufig verwendet. Heutzutage ist es die meisten Compiler einfach ignorieren und Registern zuweisen nach ihren eigenen Algorithmen.

In gcc wird Register definitiv nicht ignoriert, es sei denn, Sie Optimierungsoptionen angeben. Testen Sie Ihren Code mit so etwas wie dieses

unsigned int array[10];

int n;

#define REG register

int main()
{
    REG unsigned int a, b, c;

    for (n = 0; n < 10; ++n){
        c = a + b;
        b = a;
        a = c;
        array[n] = c;
    }
}

Sie erhalten (je nachdem, ob REG definiert ist oder leer)

http://picasaweb.google.com/lh/photo/v2hBpl6D- soIdBXUOmAeMw? Leistung = Direktlink

Auf der linken Seite ist das Ergebnis der Verwendung Register gezeigt.

Es gibt eine begrenzte Anzahl von Registern zur Verfügung, so Markierung alles als Register alles nicht in den Registern gesetzt werden. Benchmarking ist der einzige Weg zu wissen, ob es um Hilfe oder nicht geht. Ein guter Compiler sollte in der Lage sein, um herauszufinden, welche Variablen in die Register auf ihre eigenen stellen, so sollten Sie wahrscheinlich Benchmark einige mehr, bevor Sie sich entscheiden, dass die Register Schlüsselwörter hilft.

Die Idee des Registers verwendet, ist, Ihre Variable ist extrem häufig verwendet. Wenn es irgendeine Operation mit Variable ist, wird es auf jeden Fall in ein Register kopiert werden. So Zähler (Index-Variablen) sind Kandidaten für diesen Schlüssel. Im Beispiel von Diego Torres Milano von 15. Januar '10 um 1:57 Ich würde es so machen:

unsigned int array[10];    

int main()
{
    register int n;
    unsigned int a = 1, b = 2, c;

    for (n = 0; n < 10; ++n){
        c = a + b;
        b = a;
        a = c;
        array[n] = c;
    }
}

Es gibt eine Grenze für zuweisbare Register. Wenn Sie es outgo, die Sie gerade mit weniger effizienten Code am Ende.

Meine Meinung ist, dass wenn das, was Sie tun, ist so wichtig, dass Sie sich entscheiden, müssen Sie sich, was in einem Register geht und was nicht der Fall ist, sollten Sie es schreiben Assemblersprache verwendet wird.

Für allgemeine Zwecke Sprachen, ich bin der festen Überzeugung, dass ein Compiler besser in der Lage ist, zu entscheiden, was als ein Mensch in einem Register geht. Der Beweis ist, dass, wenn Sie nicht sicher sind, wie viele Variablen, die Sie in den Registern setzen können, der Compiler sicher weiß.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top