Я использую mingw32-gcc, со стандартом C99. Я вставил ниже код с несколькими изменениями из статьи о ключевое слово restrict
- http://wr.informatik.uni-hamburg.de/_media/teaching/wintersemester_2013_2014/epc-1314-fasselt-c-keywords-report.pdf. По словам автора, "Result One"
и "Result Two"
должны быть разными, но когда я его запускаю, они одинаковы. Я не получаю никаких предупреждений компилятора. Есть ли какие-то настройки, которые мне не хватает?ограничение-ключевое слово не работает?
#include <stdio.h>
void update(int* a, int* b, int* c)
{
*a += *c;
*b += *c;
}
void update_restrict(int* a, int* b, int* restrict c)
{
printf("*c = %d\n",*c);
*a += *c;
printf("\n*c = %d - ",*c);
printf("shouldn't this have stayed the same?\n\n");
*b += *c;
}
int main()
{
int a = 1, b = 2;
update(&a, &b, &a);
printf("Result One: a, b = %d, %d\n", a, b);
a = 1; b = 2; // reset values
update_restrict(&a, &b, &a);
printf("Result Two: a, b = %d, %d\n", a, b);
getchar();
return 0;
}
'ограничивать' не должно влиять на ваш выход. Только для компилятора возможны возможные оптимизации. Результаты могут быть одинаковыми и могут быть разными. – cshu
Я думал, что в 'update_restrict' значение * c останется неизменным после того, как * a будет изменен, так как он загружается только один раз. Я не вижу, как это не может повлиять на результаты. –
Вы не сказали, как вы компилируете (версия компилятора, флаги командной строки и т. Д.). Gcc имеет слабую интерпретацию значения ограничения: обозначение одного ограничения переменной практически бесполезно с gcc, оно предполагает, что две переменные, которые ** оба ** ограничены, не являются псевдонимами. Кроме того, компилятор может очень хорошо встроить функции, которые могут заставить проблему исчезнуть. Используйте '__attribute __ ((noinline, noclone))' on update_restrict, чтобы этого избежать. –