In C programlama dilinin , C99 standardından, restrictkullanılabilecek bir anahtar kelimedir işaretçi bildirimleri . Anahtar kelime restrict , programcı tarafından derleyiciye verilen bir niyet ifadesidir . İşaretçinin ömrü boyunca, işaret pointer + 1ettiği nesneye erişmek için yalnızca işaretçinin kendisinin veya doğrudan türetilmiş bir değerin (örneğin ) kullanılacağını belirtir. Bu, işaretçi takma adının etkilerini sınırlayarak optimizasyonlara yardımcı olur. Niyet ifadesi ihlal edilirse ve nesneye bağımsız bir işaretçi tarafından ulaşılırsa, bu tanımsız davranışa neden olur. Anahtar kelimenin kullanımı, restrict prensip olarak, Fortran'da yazılmış aynı programla aynı performansı elde etmeyi sağlar .
C ++ için standart destek yoktur restrict, ancak çoğu derleyicinin genellikle C ++ ve C'de çalışan eşdeğerleri vardır; örneğin GCC ve Clang için __restrict__ ve Visual C ++ için __restrict ve __declspec (restrict) .
Derleyici bir bellek bloğuna yalnızca bir işaretçi olduğunu bilirse, daha iyi optimize edilmiş kod üretebilir.
Örneğin :
void updatePtrs(size_t *ptrA, size_t *ptrB, size_t *val) { *ptrA += *val; *ptrB += *val; }Kodda yukarıda işaretçileri ptrA, ptrBve val olabilir derleyici daha az iyi bir kod oluşturabilir, böylece, aynı bellek konumuna bakınız:
load R1 ← *val ; Charge la valeur pointé par val load R2 ← *ptrA ; Charge la valeur pointé par ptrA add R2 += R1 ; Effectuer une Addition set R2 → *ptrA ; mettre à jour la valeur pointé par ptrA ; De même pour ptrB, notez que val est chargé à deux reprises, parce que ; ptrA peut être égal à val (c'est à dire, pointe vers le même emplacement). load R1 ← *val load R2 ← *ptrB add R2 += R1 set R2 → *ptrBBununla birlikte, anahtar kelime restrict kullanılırsa ve yukarıdaki işlev şu şekilde bildirilirse:
void updatePtrs(size_t *restrict ptrA, size_t *restrict ptrB, size_t *restrict val);Daha sonra derleyici izin verilir varsayalım o ptrA, ptrBve valfarklı yerlerde ve diğer işaretçileri etkilemeyeceğini güncelleme bir pointer gelin. Programcı (derleyici değil), işaretçilerin aynı yerleri göstermemesini sağlamaktan sorumludur.
Artık derleyici aşağıdaki gibi daha iyi kod üretebilir:
load R1 ← *val load R2 ← *ptrA add R2 += R1 set R2 → *ptrA ; Notez que val n'est pas rechargé, ; parce que le compilateur sait que c'est inchangé load R2 ← *ptrB add R2 += R1 set R2 → *ptrBMontaj kodunun daha kısa olduğunu unutmayın çünkü işaret edilen değer valyalnızca bir kez yüklenir.