Rumah > pembangunan bahagian belakang > C++ > Apakah yang Dilakukan oleh Kata Kunci `restrict` C dan Bagaimana Ia Mengoptimumkan Kod?

Apakah yang Dilakukan oleh Kata Kunci `restrict` C dan Bagaimana Ia Mengoptimumkan Kod?

Patricia Arquette
Lepaskan: 2024-12-26 22:58:17
asal
753 orang telah melayarinya

What Does the C   `restrict` Keyword Do and How Does It Optimize Code?

Apakah Maksud Kata Kunci 'Sekat' dalam C?

Kata kunci sekatan dalam C (sintaks pra-C 14 hanya sah sebagai sambungan GCC) menentukan bahawa dua atau lebih penunjuk yang dihantar ke fungsi tidak menghala ke memori bertindih rantau.

C99 Standard

Dalam C99, sekatan bertujuan untuk mengoptimumkan kod dengan membenarkan pengkompil menganggap bahawa penunjuk tidak akan menyamakan satu sama lain. Ini boleh menghasilkan peningkatan prestasi yang ketara dengan mendayakan pengoptimuman seperti pembukaan gelung dan vektorisasi, seperti yang ditunjukkan dalam contoh berikut:

void f(int *a, int *b, int *x) {
  *a += *x;
  *b += *x;
}

void fr(int *__restrict__ a, int *__restrict__ b, int *__restrict__ x) {
  *a += *x;
  *b += *x;
}
Salin selepas log masuk

Tanpa sekatan, dua arahan pemasangan diperlukan untuk memuatkan nilai 'x' untuk kedua-dua 'a' dan 'b', tetapi dengan had, nilai 'x' dimuatkan sekali sahaja.

GCC Pengoptimuman

GCC boleh memanfaatkan sekatan untuk mengoptimumkan kod, seperti yang ditunjukkan oleh kod pemasangan berikut:

f:
    mov    (%rdx),%eax
    add    %eax,(%rdi)
    mov    (%rdx),%eax
    add    %eax,(%rsi)

fr:
    mov    (%rdx),%eax
    add    %eax,(%rdi)
    add    %eax,(%rsi)
Salin selepas log masuk

Dalam contoh ini, fungsi 'fr' yang dioptimumkan dengan sekatan mempunyai satu kurang arahan pemasangan daripada 'f' yang tidak dioptimumkan fungsi.

Array

Had boleh berguna terutamanya apabila berurusan dengan hujah penunjuk yang merujuk tatasusunan, membenarkan pengkompil mengoptimumkan operasi seperti memset dan memcpy, yang berpotensi meningkatkan prestasi.

Susun atur Contoh

void f(char *restrict p1, char *restrict p2, size_t size) {
     for (size_t i = 0; i < size; i++) {
         p1[i] = 4;
         p2[i] = 9;
     }
 }
Salin selepas log masuk

Dengan sekatan, kod ini boleh dioptimumkan untuk menggunakan memset untuk kecekapan yang lebih tinggi. Mengalih keluar sekatan akan melumpuhkan pengoptimuman ini, membawa kepada tingkah laku yang salah jika tatasusunan bertindih.

Peraturan Aliasing Tegas

Had hanya terpakai pada penunjuk jenis yang serasi, disebabkan oleh ketatnya peraturan aliasing. Menghantar jenis yang tidak serasi kepada jenis yang sah akan memecahkan kontrak sekatan, yang berpotensi membawa kepada tingkah laku yang tidak ditentukan.

Sambungan GCC

GCC juga membenarkan sekatan digunakan dengan rujukan dan fungsi ahli, memperluaskan skop keupayaan pengoptimumannya.

Atas ialah kandungan terperinci Apakah yang Dilakukan oleh Kata Kunci `restrict` C dan Bagaimana Ia Mengoptimumkan Kod?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan