Schlüsselwort restrict
-
Nur relativ kurze Fragen zum Schlüsselwort
restrict
:struct foo { char*foo_1; char*foo_2; char*foo_3; }; void clear_foo(struct foo*restrict const foo_obj) { memset(foo_obj,0,sizeof(*foo_obj)); } void do_something(struct foo*restrict const foo_obj) { clear_foo(foo_obj); /*Mache danach irgendwas mit foo_obj, hauptsächlich schreiben.*/ }
In
do_something
wirdfoo_obj
restricted deklariert, genau wie inclear_foo
. C99 sagt, dassrestrict
dem Compiler garantiert, dass während des Lebenszyklus des Zeigers kein anderer Zeiger auf die Daten des ersten Zeigers schreibt. Was in der Theorie hieße, dassdo_something
noch Daten in der CPU oder im Cache halten könnte, dieclear_foo
gerade gesetzt hat und beim Abbauen des Zeigers die Elemente zurück in den Speicher schreibt, und nach der Funktion würde der Compiler nur die Daten, die er nicht mehr hat, nachladen (in der Theorie - fassen wir das unter UB zusammen, und UB wollen wir verhindern), korrekt?Was wiederum bedeutet, dass ich bei
do_something
restrict
entfernen müsste, damit er nach dem Aufruf vonclear_foo
die Daten entweder neu lädt oder direkt wieder über den Zeiger auf die Werte zugreift und nichts im Cache hält, korrekt?
-
Nein, das ist nicht die Interpretation von restrict. Und auch nicht, wie ein Computer funktioniert. Und sogar deine Beschreibung von restrict ist ungenau und daher irreführend.
https://en.wikipedia.org/wiki/Restrict
http://en.cppreference.com/w/c/language/restrict