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; }
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)
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; } }
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!