restrict — ключове слово в мові програмування C, введене стандартом C99 і використовуване в оголошеннях вказівників.
char * restrict p1; int ** restrict p2; float * restrict p3, * restrict p4;
Ключове слово restrict
дозволяє програмісту повідомити компілятору, що оголошуваний вказівник адресує ділянку пам'яті, на яку не посилається ніякий інший вказівник. Гарантію того, що на ділянку пам'яті не будуть посилатися інші вказівники, дає програміст. При цьому оптимізувальний компілятор може генерувати ефективніший код (приклад див. нижче).
Використання ключового слова restrict
при оголошенні інших об'єктів (не вказівників) стандартом не визначено.
При використанні ключового слова restrict
програма, написана на «розумному» C, може зрівнятися за швидкістю з програмою, написаною на «дурному» Fortran.
У мові немає ключового слова restrict
(не описано в стандарті), але розробники різних компіляторів C++ додали аналогічні за призначенням ключові слова, наприклад:
__restrict
і__restrict__
у GNU Compiler Collection;__restrict
і__declspec(restrict)
у ;__restrict__
у Clang.
Приклад оптимізації
Компілятор може створювати менше коду, якщо знає, що тільки один вказівник адресує один блок пам'яті. Розглянемо приклад. Визначено таку функцію:
void updatePtrs( size_t* ptrA, size_t* ptrB, size_t* val ) { *ptrA += *val; *ptrB += *val; }
Вказівники ptrA
, ptrB
і val
можуть посилатися на один і той самий блок пам'яті. Для цієї функції компілятор буде генерувати приблизно такий код:
; прочитати значення з пам'яті за вказівником val load R1 ← *val ; прочитати значення з пам'яті за вказівником ptrA load R2 ← *ptrA ; виконати додавання add R2 += R1 ; записати результат у пам'ять за вказівником ptrA set R2 → *ptrA ; аналогічно для ptrB load R1 ← *val ; читання за val другий раз load R2 ← *ptrB add R2 += R1 set R2 → *ptrB
Зверніть увагу, що значення за вказівником val
читається з пам'яті двічі, оскільки вказівник ptrA
може посилатися на той самий блок пам'яті, що й val
, тобто значення val
може змінитися під час записування значення за вказівником ptrA
. За використання ключового слова restrict
визначення функції буде таким:
void updatePtrs( size_t* restrict ptrA, size_t* restrict ptrB, size_t* restrict val ) { *ptrA += *val; *ptrB += *val; }
Ключове слово restrict
повідомляє компілятору, що вказівники ptrA
, ptrB
і val
ніколи не адресують одного й того ж блока пам'яті. Це гарантує програміст. У цьому випадку компілятор згенерує приблизно такий код:
load R1 ← *val load R2 ← *ptrA add R2 += R1 set R2 → *ptrA ; load R1 ← *val ; відсутній load R2 ← *ptrB add R2 += R1 set R2 → *ptrB
Зауважте, що код став коротшим через те, що значення val
читається з пам'яті тільки один раз.
Приклади невизначеної поведінки
Вказівник із кваліфікатором типу restrict
на вказівник із кваліфікатором типу restrict
можна визначити тільки у вкладеному блоці. Приклад:
struct T { int i; }; struct T var_1; int main() { struct T* restrict var_2 = &var_1; int* restrict var_3 = &var_2->i; // невизначена поведінка { int* restrict var_4 = &var_2->i; // допустимо } return 0; }
Визначення вказівника var_3
— невизначена поведінка, оскільки var_3
міститься в одному блоці з var_2
. Визначення var_4
міститься у вкладеному блоці і допустиме.
__restrict для методів у C++
Ключове слово __restrict
для методу структури або класу позначає, що покажчик this
має тип «T * __restrict const
». Приклад:
struct T { void method () __restrict {} };
Див. також
- (англ.) — пояснення та приклади використання.
- Walls, Douglas. . Oracle™. Архів оригіналу за 21 червня 2013. Процитовано 21 листопада 2012.
- Restricted pointers in C [ 26 березня 2013 у Wayback Machine.](англ.) — про причини введення.
Примітки
- (23 жовтня 2007). . Що кожен програміст має знати про пам'ять (англійською) . Електронний журнал . Архів оригіналу за 30 березня 2015. Процитовано 29 березня 2022. - Без ключового слова
restrict
компілятор вважає, що вказівники можуть вказувати на той самий блок пам'яті, і генерує не оптимальний код. Це одна з причин того, що мова Fortran все ще використовується для числових розрахунків (дозволяє писати швидкий код простіше). Теоретично, введенняrestrict
у C99 має вирішити цю проблему. - gnu.org Restricting pointer aliasing [ 6 серпня 2016 у Wayback Machine.](англ.). Документація gcc.
Література
- Черновик стандарта ISO/IEC 9899:TC2. Язык программирования C. — ISO, 2005. — Число 6. — 5. — С. 108—112. Архівовано з джерела 22 серпня 2011. Процитовано 2008-12-22.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
restrict klyuchove slovo v movi programuvannya C vvedene standartom C99 i vikoristovuvane v ogoloshennyah vkazivnikiv char restrict p1 int restrict p2 float restrict p3 restrict p4 Klyuchove slovo restrict dozvolyaye programistu povidomiti kompilyatoru sho ogoloshuvanij vkazivnik adresuye dilyanku pam yati na yaku ne posilayetsya niyakij inshij vkazivnik Garantiyu togo sho na dilyanku pam yati ne budut posilatisya inshi vkazivniki daye programist Pri comu optimizuvalnij kompilyator mozhe generuvati efektivnishij kod priklad div nizhche Vikoristannya klyuchovogo slova restrict pri ogoloshenni inshih ob yektiv ne vkazivnikiv standartom ne viznacheno Pri vikoristanni klyuchovogo slova restrict programa napisana na rozumnomu C mozhe zrivnyatisya za shvidkistyu z programoyu napisanoyu na durnomu Fortran U movi C nemaye klyuchovogo slova restrict ne opisano v standarti ale rozrobniki riznih kompilyatoriv C dodali analogichni za priznachennyam klyuchovi slova napriklad restrict i restrict u GNU Compiler Collection restrict i declspec restrict u Visual C restrict u Clang Priklad optimizaciyiKompilyator mozhe stvoryuvati menshe kodu yaksho znaye sho tilki odin vkazivnik adresuye odin blok pam yati Rozglyanemo priklad Viznacheno taku funkciyu void updatePtrs size t ptrA size t ptrB size t val ptrA val ptrB val Vkazivniki ptrA ptrB i val mozhut posilatisya na odin i toj samij blok pam yati Dlya ciyeyi funkciyi kompilyator bude generuvati priblizno takij kod prochitati znachennya z pam yati za vkazivnikom val load R1 val prochitati znachennya z pam yati za vkazivnikom ptrA load R2 ptrA vikonati dodavannya add R2 R1 zapisati rezultat u pam yat za vkazivnikom ptrA set R2 ptrA analogichno dlya ptrB load R1 val chitannya za val drugij raz load R2 ptrB add R2 R1 set R2 ptrB Zvernit uvagu sho znachennya za vkazivnikom val chitayetsya z pam yati dvichi oskilki vkazivnik ptrA mozhe posilatisya na toj samij blok pam yati sho j val tobto znachennya val mozhe zminitisya pid chas zapisuvannya znachennya za vkazivnikom ptrA Za vikoristannya klyuchovogo slova restrict viznachennya funkciyi bude takim void updatePtrs size t restrict ptrA size t restrict ptrB size t restrict val ptrA val ptrB val Klyuchove slovo restrict povidomlyaye kompilyatoru sho vkazivniki ptrA ptrB i val nikoli ne adresuyut odnogo j togo zh bloka pam yati Ce garantuye programist U comu vipadku kompilyator zgeneruye priblizno takij kod load R1 val load R2 ptrA add R2 R1 set R2 ptrA load R1 val vidsutnij load R2 ptrB add R2 R1 set R2 ptrB Zauvazhte sho kod stav korotshim cherez te sho znachennya val chitayetsya z pam yati tilki odin raz Prikladi neviznachenoyi povedinkiVkazivnik iz kvalifikatorom tipu restrict na vkazivnik iz kvalifikatorom tipu restrict mozhna viznachiti tilki u vkladenomu bloci Priklad struct T int i struct T var 1 int main struct T restrict var 2 amp var 1 int restrict var 3 amp var 2 gt i neviznachena povedinka int restrict var 4 amp var 2 gt i dopustimo return 0 Viznachennya vkazivnika var 3 neviznachena povedinka oskilki var 3 mistitsya v odnomu bloci z var 2 Viznachennya var 4 mistitsya u vkladenomu bloci i dopustime restrict dlya metodiv u C Klyuchove slovo restrict dlya metodu strukturi abo klasu C poznachaye sho pokazhchik span class k this span maye tip span class n T span span class w span span class o span span class w span span class k restrict span span class w span span class k const span Priklad struct T void method restrict Div takozh angl poyasnennya ta prikladi vikoristannya Walls Douglas Oracle Arhiv originalu za 21 chervnya 2013 Procitovano 21 listopada 2012 Restricted pointers in C 26 bereznya 2013 u Wayback Machine angl pro prichini vvedennya Primitki 23 zhovtnya 2007 Sho kozhen programist maye znati pro pam yat anglijskoyu Elektronnij zhurnal Arhiv originalu za 30 bereznya 2015 Procitovano 29 bereznya 2022 Bez klyuchovogo slova restrict kompilyator vvazhaye sho vkazivniki mozhut vkazuvati na toj samij blok pam yati i generuye ne optimalnij kod Ce odna z prichin togo sho mova Fortran vse she vikoristovuyetsya dlya chislovih rozrahunkiv dozvolyaye pisati shvidkij kod prostishe Teoretichno vvedennya restrict u C99 maye virishiti cyu problemu gnu org Restricting pointer aliasing 6 serpnya 2016 u Wayback Machine angl Dokumentaciya gcc LiteraturaChernovik standarta ISO IEC 9899 TC2 Yazyk programmirovaniya C ISO 2005 Chislo 6 5 S 108 112 Arhivovano z dzherela 22 serpnya 2011 Procitovano 2008 12 22