Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Giải thích từ khóa volatile và restrict trong C

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