Вот код, который я написал (используя __restrict__
расширение GCC для C++):
#include
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;
}
Или версия на C (если версия на C++ не ясна из-за использования расширения, которое поддерживает каждый популярный компилятор C++), используя GCC:
#include
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;
}
Из того, что я прочитал, если я делаю *a = 5
, это изменяет значение памяти, на которую он, a
, указывает; после этого память, на которую он указывает, не должна быть изменена никем другим, кроме a
, что означает, что эти программы неверны, потому что b
и c
изменяют ее после этого.
Или, даже если b
сначала модифицирует i
, то после этого только a
должен иметь доступ к этой памяти (i
).
Правильно ли я понимаю?
P.S.: Ограничение в этой программе ничего не меняет. С ограничением или без него, компилятор выдаст один и тот же ассемблерный код. Я написал эту программу только для того, чтобы прояснить ситуацию, она не является хорошим примером использования restrict
. Хороший пример использования restrict
вы можете увидеть здесь: http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html