Mặc dù câu trả lời của Jeff là đúng, nghĩa là bạn luôn có thể làm cho một con trỏ đến mảng phân bổ, thực tế là trình biên dịch biết tại thời gian biên dịch rằng tmpvalues sẽ không được aliased vì biến được khai báo là một mảng thực tế, không phải là một con trỏ. Các cơ hội duy nhất để bí danh một mảng là khai báo một con trỏ đến nó, vì vậy nếu bạn không làm điều đó, không cần phải khai báo nó là restrict
. Điều này hiển nhiên hơn nếu tmpvalues
là biến duy nhất bạn sẽ có trong hàm.
Sự cố có thể phát sinh nếu bạn chuyển con trỏ đến một hàm khác, khi đó bạn nên nêu rõ con trỏ đã nhận có bị hạn chế hay không.
Các tài liệu tôi gặp phải liên quan đến chủ đề này bao gồm các C99:
Cho D là một lời tuyên bố của một định danh thường cung cấp một phương tiện của chỉ định một đối tượng P như một con trỏ hạn chế trình độ gõ T .
Lưu ý rằng nó chỉ áp dụng cho con trỏ.
This other document từ TI cung cấp một số gợi ý điều chỉnh hiệu suất bằng cách sử dụng từ khóa restrict
. Ngoài tất cả các gợi ý, phần 3.3 cung cấp các ví dụ khi có thể áp dụng loại vòng loại này và khi nào thì không. Tìm kiếm khai báo mảng x
ở giữa trang 16, nó tuyên bố rằng nó không khai báo một con trỏ và do đó không thể là restrict
-qualified.
Loại cảnh báo nào sẽ ném? – dhein
"sử dụng không hợp lệ các giới hạn" - nó được cho là được sử dụng với con trỏ, không phải mảng (theo như tôi hiểu). Tôi có thể làm nổi * hạn chế tmpvalues = malloc (sizeof (float) * 1000) nhưng sau đó tôi không phân bổ trên stack có thể ảnh hưởng đến hiệu suất là tốt. Bên cạnh việc nói với một trình biên dịch truy cập vào các chỉ mục mảng là an toàn (vì vậy không cần đọc phòng thủ) có vẻ như phần mở rộng tự nhiên hạn chế sử dụng với con trỏ, vì vậy trực giác phải có cách để làm điều đó. –
Tôi đã làm: float * limits tmpvalues = alloca (sizeof (float) * 1000); memset (tmpvalues, 0, sizeof (float) * 1000); và đó là cải tiến có thể đo lường nhưng tôi thích làm nó trong tiêu chuẩn (như trong cách khiếu nại C99) –