Dưới đây là một số mã tôi đã viết (sử dụng __restrict__
phần mở rộng của GCC C++):Cách * hạn chế/* __ restrict__ hoạt động trong C/C++?
#include <iostream>
using namespace std;
int main(void) {
int i = 7;
int *__restrict__ a = &i;
*a = 5;
int *b = &i, *c = &i;
*b = 8;
*c = 9;
cout << **&a << endl; // *a - which prints 9 in this case
return 0;
}
Hoặc, phiên bản C (trong trường hợp phiên bản C++ là không rõ ràng do việc sử dụng một phần mở rộng mà mỗi phổ biến C++ hỗ trợ), sử dụng GCC:
#include <stdio.h>
int main(void) {
int i = 7;
int *restrict a = &i;
*a = 5;
int *b = &i, *c = &i;
*b = 8;
*c = 9;
printf("%d \n", **&a); // *a - which prints 9 in this case
return 0;
}
Từ những gì tôi đã đọc, nếu tôi làm *a = 5
, nó thay đổi giá trị của bộ nhớ ông, a
, trỏ đến; sau đó, bộ nhớ mà người đó đang trỏ đến không được sửa đổi bởi bất kỳ ai khác ngoại trừ a
, điều đó có nghĩa là các chương trình này sai vì b
và c
sửa đổi nó sau đó. Hoặc, ngay cả khi b
sửa đổi i
trước tiên, sau đó chỉ a
sẽ có quyền truy cập vào bộ nhớ đó (i
). Tôi có nhận được chính xác không?
P.S: Hạn chế trong chương trình này không thay đổi bất cứ điều gì. Có hoặc không có giới hạn, trình biên dịch sẽ tạo ra cùng một mã assembly. Tôi đã viết chương trình này chỉ để làm rõ mọi thứ, nó không phải là một ví dụ tốt của việc sử dụng restrict
. Một ví dụ tốt về restrict
sử dụng bạn có thể xem tại đây: http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html
Không có 'giới hạn' trong C++; bất cứ điều gì khác là một phần mở rộng trình biên dịch. –
có thể trùng lặp của [Con người có thể tạo ra từ vòng loại hạn chế nào?] (Http://stackoverflow.com/questions/1506794/what-can-human-beings-make-out-of-the-restrict-qualifier) –
@KerrekSB Xem xét chương trình này trong C, sử dụng "hạn chế", tôi đã hỏi C/C++ ... Một trong số đó. –