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 wird foo_obj restricted deklariert, genau wie in clear_foo . C99 sagt, dass restrict 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, dass do_something noch Daten in der CPU oder im Cache halten könnte, die clear_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 von clear_foo die Daten entweder neu lädt oder direkt wieder über den Zeiger auf die Werte zugreift und nichts im Cache hält, korrekt?


  • Mod

    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


Log in to reply