rajoittaa on C99 - standardin käyttöönoton C - ohjelmointikielen avainsana , jota käytetään osoitinlausekkeissa .
char * rajoittaa p1 ; int ** rajoittaa p2 ; float * rajoittaa p3 , * rajoittaa p4 ;Avainsanan restrictavulla ohjelmoija voi kertoa kääntäjälle , että ilmoitettu osoitin osoittaa muistialueen, johon mikään muu osoitin ei viittaa. Ohjelmoija antaa takuun siitä, että useampi kuin yksi osoitin ei viittaa muistialueeseen. Tässä tapauksessa optimoiva kääntäjä voi tuottaa tehokkaamman koodin (katso esimerkki alla).
Avainsanan käyttöä restrictmuiden kohteiden kuin osoittimien määrittelyssä ei ole määritelty standardissa.
Avainsanaa restrictkäytettäessä "älykkäällä" C:llä kirjoitettu ohjelma voi olla yhtä nopea kuin "tyhmä" Fortranilla kirjoitettu ohjelma [1] .
C++-kielessä ei ole avainsanaa restrict(ei kuvattu standardissa), mutta eri C++-kääntäjien kehittäjät ovat lisänneet tarkoitukseltaan samanlaisia avainsanoja, esim.
Kääntäjä voi tuottaa vähemmän koodia, jos se tietää, että vain yksi osoitin osoittaa yhden muistilohkon. Harkitse esimerkkiä. Seuraava toiminto on määritelty:
void updatePtrs ( size_t * ptrA , size_t * ptrB , koko_t * val ) { * ptrA += * val ; * ptrB += * val ; }Osoittimet ptrA, ptrBja valne voivat viitata samaan muistilohkoon.
Tätä toimintoa varten kääntäjä luo jotain seuraavan koodin kaltaista:
kuorma R1 ← * val ; lue arvo muistista osoittimen arvossa kuorma R2 ← * ptrA ; lue arvo muistista osoittimesta ptrA add R2 += R1 ; suorita summaussarja R2 → * ptrA ; kirjoita tulos muistiin osoittimessa ptrA ; samanlainen ptrB- kuormalle R1 ← * val ; lukee val toisen kerran kuorma R2 ← * ptrB add R2 += R1 set R2 → * ptrBHuomaa, että osoittimen arvo valluetaan muistista kahdesti. Tämä johtuu siitä, että osoitin ptrAvoi viitata samaan muistilohkoon kuin val, mikä tarkoittaa, että arvo valvoi muuttua, kun arvo kirjoitetaan osoittimeen ptrA.
Käytettäessä avainsanaa restrictfunktion määritelmä olisi seuraava:
void updatePtrs ( size_t * rajoittaa ptrA , size_t * rajoittaa ptrB , size_t * rajoitusarvo _ ) { * ptrA += * val ; * ptrB += * val ; }Avainsana restrictkertoo kääntäjälle, että ptrA, ptrBja osoittimet valeivät koskaan osoita samaa muistilohkoa. Tämän takaa ohjelmoija.
Tässä tapauksessa kääntäjä luo jotain seuraavan koodin kaltaista:
kuorma R1 ← * val kuorma R2 ← * ptrA add R2 += R1 set R2 → * ptrA ; kuorma R1 ← *val ; puuttuu kuorma R2 ← * ptrB add R2 += R1 set R2 → * ptrBHuomaa, että koodi on lyhentynyt, koska arvo valluetaan muistista vain kerran.
Tyyppitunnisteen sisältävä osoitin tyyppitunnisteella restrictvarustettuun osoittimeen restrictvoidaan määrittää vain sisäkkäisessä lohkossa. Esimerkki:
struct T { int i ; }; rakenne T var_1 ; int main () { struct T * rajoittaa var_2 = & var_1 ; int * rajoittaa var_3 = & var_2 -> i ; // määrittelemätön käyttäytyminen { int * rajoittaa var_4 = & var_2 -> i ; // voimassa } paluu 0 ; }Osoittimen määrittäminen var_3 on määrittelemätöntä toimintaa , koska se var_3on samassa lohkossa kuin var_2. Määritelmä var_4on sisäkkäisessä lohkossa ja on kelvollinen.
C++-__restrict rakenteen tai luokkametodin avainsana osoittaa, että osoitin on tyyppiä " ". Esimerkki: thisT * __restrict const
rakenne T { void method () __restrict {} };