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_somethingwirdfoo_objrestricted deklariert, genau wie inclear_foo. C99 sagt, dassrestrictdem 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_somethingnoch Daten in der CPU oder im Cache halten könnte, dieclear_foogerade 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_somethingrestrictentfernen müsste, damit er nach dem Aufruf vonclear_foodie 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