Type Qualifiers (Chỉ định kiểu)
Thêm thuộc tính đặc biệt cho kiểu dữ liệu. Có 3 loại: const, volatile, restrict.
volatile
Báo cho trình biên dịch biết biến có thể bị thay đổi bởi bên ngoài (ngắt phần cứng, luồng khác, ánh xạ bộ nhớ...). Tránh tối ưu hóa giả định giá trị không đổi.
volatile int x;
restrict
Chỉ dùng với con trỏ. Khẳng định con trỏ này là cách duy nhất truy cập đối tượng nó trỏ đến trong phạm vi đó. Giúp trình biên dịch tối ưu hóa mạnh hơn.
Ví dụ so sánh
Không dùng restrict (volatile)
int *ptr; int a = 0; ptr = &a; *ptr += 4; // Không thể gộp thành *ptr += 9 *ptr += 5; // vì 'a' có thể bị truy cập bằng cách khác
Dùng restrict
int *restrict ptr; int a = 0; ptr = &a; *ptr += 4; // Có thể gộp thành *ptr += 9 *ptr += 5; // vì chắc chắn không có con trỏ khác trỏ đến 'a'
Chương trình minh họa restrict
#include <stdio.h>
void keyword(int *a, int *b, int *restrict c) {
*a += *c;
*b += *c;
}
int main() {
int p = 10, q = 20, r = 30;
keyword(&p, &q, &r);
printf("%d %d %d", p, q, r); // 40 50 30
return 0;
}
Kết quả
40 50 30