şükela:  tümü | bugün
  • 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.