Warum gibt es keinen Effekt von Zeiger beschränken

8

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:

%Vor%

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.

    
phoxis 01.10.2012, 20:16
quelle

2 Antworten

3

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 .

    
Michael Burr 01.10.2012, 22:17
quelle
7

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.

    
Doug Currie 01.10.2012 20:29
quelle

Tags und Links