Ich kann keinen Unterschied des Codes durch gcc sehen, um Zeiger einzuschränken.
Datei1
%Vor%Datei2
%Vor%kompilieren mit
%Vor% file1.s und file2.s sind beide gleich, mit Ausnahme der Zeile .file
, die den Dateinamen angibt:
Beide Codes lesen aus dem Speicher und weisen dann den Speicherplatz zu, auf den a
bis b
zeigen. Wo ich erwartet hatte, wird die restrict
version die Adressen von a
und b
nicht erneut lesen, und die Adressen von a
und b
werden in-Register inkrementiert und am Ende in den Speicher geschrieben.
Gibt es etwas, was ich falsch mache? Oder ist die Auswahl des Beispiels in Ordnung?
Ich habe versucht, mit verschiedenen Schaltern -O0
, -O1
, -O2
, -O3
, -Ofast
und -fstrict-aliasing
mit den gleichen identischen Ergebnissen für beide Dateien.
Hinweis: gcc --version = gcc (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2)
BEARBEITEN Code geändert.
Die Sache ist, dass der folgende Ausdruck:
%Vor% muss ziemlich genau alle Zeiger in jeder Schleifeniteration dereferenzieren, da sich die Zeiger bei jeder Iteration ändern. Es gibt keinen Vorteil für die Verwendung von restrict
.
Versuchen Sie, die Zeile innerhalb der Schleife zu ändern:
%Vor% (möglicherweise müssen Sie auch Optimierungen wie -O2
aktivieren).
Sie werden sehen, dass es im Fall restrict
einmal *b
in ein Register lädt, während es im Fall ohne Beschränkung in jeder Schleifeniteration durch den Zeiger geladen werden muss, weil es nicht weiß, ob oder nicht c
immer Aliase b
.
Sie lesen nur einen der Zeiger, also spielt restrict
keine Rolle.
Siehe dieses Beispiel , wo es wichtig ist, weil die Zeiger dies können Alias die gleichen Daten, und die Daten werden durch beide Zeiger geschrieben und gelesen.
Tags und Links c pointers restrict-qualifier