__restrict__
-
bunu kullanırsanız, derleyici 1 satır assembly (1 opcode) tasarruf eder.
--- code ---
void sum1(int *a, int *b, int *x) {
*a += *x;
*b += *x;
return;
}
void sum2(int *a, int *b, int *__restrict__ x) {
*a += *x;
*b += *x;
return;
}
int main() {
int a = 10;
int b = 20;
int x = 50;
sum1(&a, &b, &x);
printf("%d %d %d\n", a, b, x);
sum2(&a, &b, &x);
printf("%d %d %d\n", a, b, x);
return 0;
}
--- code ---
yukarıdaki kod için sum1 ve sum2 assembly satırları:
--- asm ---
sum1:
movl (%r8), %eax
addl %eax, (%rcx)
movl (%r8), %eax
addl %eax, (%rdx)
ret
sum2:
movl (%r8), %eax
addl %eax, (%rcx)
addl %eax, (%rdx)
ret
--- asm ---
görüleceği üzere, sum1'de x'in stack adresinde yazılı değer eax register'ine her iki toplama işlemi için ayrı ayrı (iki defa) yükleniyor. oysa __restrict__ kullanınca, sadece bir defa...
lan, tek bir opcode peşine mi düşeceğiz?
bazen evet! sum1 alt fonksiyon için bir semaphore kilidi kullanmıyorsanız, programın yapısı gereği (pointer kullanıldığından), art arda gelen iki toplama işlemi arasına bir başka thread'in girip x'in değerini değiştirme ihtimali her zaman var.
ekşi sözlük kullanıcılarıyla mesajlaşmak ve yazdıkları entry'leri
takip etmek için giriş yapmalısın.
hesabın var mı? giriş yap