Я использую 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;
}
restrict
не должен влиять на ваш вывод. Это только для компилятора, чтобы сделать возможные оптимизации. Результаты могут быть одинаковыми, а могут отличаться. - person cshu   schedule 28.04.2015update_restrict
значение *c останется прежним после изменения *a, поскольку оно загружается только один раз. Я не понимаю, как это не может повлиять на результаты. - person Nathan Schmidt   schedule 28.04.2015__attribute__((noinline,noclone))
для update_restrict, чтобы избежать этого. - person Marc Glisse   schedule 28.04.2015__attribute__((noinline,noclone))
, но все равно получил те же результаты. Я попробую несколько примеров с несколькими ограничениями. - person Nathan Schmidt   schedule 28.04.2015update_restrict()
отмечены ключевым словомrestrict
. Обратите внимание, что, как упоминает @Griddoor, неопределенное поведение не означает, что симптом проблемы должен возникнуть, а только то, что он может возникнуть. - person Michael Burr   schedule 28.04.2015-O3
), конечно, компилятор не оптимизирует... - person Marc Glisse   schedule 28.04.2015