Rajoittaa

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 22. maaliskuuta 2021 tarkistetusta versiosta . tarkastukset vaativat 22 muokkausta .

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.

Optimointiesimerkki

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

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

Huomaa, että koodi on lyhentynyt, koska arvo valluetaan muistista vain kerran.

Esimerkkejä määrittelemättömästä käyttäytymisestä

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.

__rajoitus menetelmille C++:ssa

C++-__restrict rakenteen tai luokkametodin avainsana osoittaa, että osoitin on tyyppiä " ". Esimerkki: thisT * __restrict const

rakenne T { void method () __restrict {} };

Kirjallisuus

Katso myös

Muistiinpanot

  1. Ulrich Drepper . Muisti. Osa 5 . Mitä jokaisen ohjelmoijan tulisi tietää muistista . Sähköinen aikakauslehti lwn.net (23.10.2007). - Ilman avainsanaa kääntäjä katsoo, että osoittimet voivat osoittaa samaan muistilohkoon, ja luo epäoptimaalista koodia. Tämä on yksi syistä, miksi Fortrania käytetään edelleen numeerisiin laskelmiin (joka helpottaa nopean koodin kirjoittamista). Teoriassa C99:n käyttöönoton pitäisi ratkaista tämä ongelma. Haettu 5. joulukuuta 2014. Arkistoitu alkuperäisestä 30. maaliskuuta 2015.restrictrestrict
  2. gnu.org Restricting pointer aliasing Arkistoitu 6. elokuuta 2016 Wayback Machinessa  . gcc- dokumentaatio .