Korlátoz

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2021. március 22-én felülvizsgált verziótól ; az ellenőrzések 22 szerkesztést igényelnek .

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.

Optimalizálási példa

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 * ptrB

Vegye 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 * ptrB

Vegye figyelembe, hogy a kód rövidebb lett, mivel az érték valcsak egyszer kerül kiolvasásra a memóriából.

Példák meghatározatlan viselkedésre

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.

__restrict metódusokra a C++-ban

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 {} };

Irodalom

Lásd még

Jegyzetek

  1. Ulrich Drepper . Memória. 5. rész . Amit minden programozónak tudnia kell a memóriáról . lwn.net elektronikus magazin (2007. október 23.). - A kulcsszó nélkül a fordító úgy véli, hogy a mutatók ugyanarra a memóriablokkra mutathatnak, és nem optimális kódot generál. Ez az egyik oka annak, hogy a Fortran még mindig numerikus számításokhoz használatos (ez megkönnyíti a gyors kód írását). Elméletileg a C99 bevezetése megoldja ezt a problémát. Letöltve: 2014. december 5. Az eredetiből archiválva : 2015. március 30.restrictrestrict
  2. gnu.org Restricting pointer aliasing Archivált : 2016. augusztus 6. a Wayback Machine -nél  . gcc dokumentáció .