A rest egy kulcsszó a C programozási nyelvben , amelyet a C99 szabvány vezetett be, és mutatódeklarációkban használatos .
char * restrikciós p1 ; int ** korlátozza p2 ; float * restrikciós p3 , * restrikciós p4 ;A kulcsszó restrictlehetővé teszi a programozó számára, hogy közölje a fordítóval , hogy a deklarált mutató a memória egy olyan régióját címezi, amelyre semmilyen más mutató nem hivatkozik. A programozó garantálja, hogy egynél több mutató nem fog egy memóriaterületre hivatkozni. Ebben az esetben az optimalizáló fordító hatékonyabb kódot tud generálni (lásd az alábbi példát).
A szabvány nem határozza meg a kulcsszó használatát restrictmutatókon kívüli objektumok deklarálásakor .
A kulcsszót használva restrictegy "smart" C-ben írt program olyan gyors lehet, mint egy "buta" Fortran -ban írt program [1] .
A C++ nyelvben nincs kulcsszó restrict(a szabványban nincs leírva), de a különböző C++ fordítók fejlesztői olyan kulcsszavakat adtak hozzá, amelyek céljukban hasonlóak, pl.
A fordító kevesebb kódot tud generálni, ha tudja, hogy csak egy mutató címez egy memóriablokkot. Vegyünk egy példát. A következő függvény van meghatározva:
void updatePtrs ( size_t * ptrA , size_t * ptrB , méret_t * val ) { * ptrA += * val ; * ptrB += * val ; }Mutatók ptrA, ptrBés valugyanarra a memóriablokkra utalhatnak.
Ehhez a függvényhez a fordító valami ilyesmit generál a következő kódhoz:
terhelés R1 ← * val ; érték kiolvasása a memóriából a mutatóban val terhelés R2 ← * ptrA ; érték kiolvasása a memóriából a ptrA mutatónál add R2 += R1 ; hajtson végre összeadási készletet R2 → * ptrA ; eredményt ír a memóriába a ptrA mutatónál ; hasonló ptrB terhelés esetén R1 ← * val ; másodszor olvasva val load R2 ← * ptrB add R2 += R1 set R2 → * ptrBVegye figyelembe, hogy a mutató értéke valkétszer kerül kiolvasásra a memóriából. Ennek az az oka, hogy a mutató ptrAugyanarra a memóriablokkra hivatkozhat, mint a val, ami azt jelenti, hogy az érték valváltozhat, amikor az értéket a mutatóba írjuk ptrA.
A kulcsszó használatakor restricta függvény meghatározása a következő lenne:
void updatePtrs ( size_t * korlátozza ptrA , size_t * restrikciós ptrB , size_t * korlátozó érték ) { * ptrA += * val ; * ptrB += * val ; }A kulcsszó restrictközli a fordítóval, hogy a ptrA, ptrBés a mutatók valsoha nem ugyanazt a memóriablokkot címzik. Ezt a programozó garantálja.
Ebben az esetben a fordító valami ehhez hasonló kódot generál:
terhelés R1 ← * val load R2 ← * ptrA add R2 += R1 set R2 → * ptrA ; terhelés R1 ← *val ; hiányzó load R2 ← * ptrB add R2 += R1 set R2 → * ptrBVegye figyelembe, hogy a kód rövidebb lett, mivel az érték valcsak egyszer kerül kiolvasásra a memóriából.
A típusminősítővel rendelkező restrictmutató egy típusminősítővel rendelkező mutatóra restrictcsak beágyazott blokkban definiálható. Példa:
struct T { int i ; }; struct T var_1 ; int main () { struct T * restrikciós var_2 = & var_1 ; int * korlátoz var_3 = & var_2 -> i ; // meghatározatlan viselkedés { int * korlátoz var_4 = & var_2 -> i ; // érvényes } return 0 ; }A mutató meghatározása var_3 nem meghatározott viselkedés , mert var_3ugyanabban a blokkban van, mint a var_2. A definíció var_4egy beágyazott blokkban van és érvényes.
A C++__restrict struktúra vagy osztálymetódus kulcsszava azt jelzi, hogy a mutató " " típusú. Példa: thisT * __restrict const
struct T { érvénytelen metódus () __restrict {} };