2015-04-28 8 views
1

Я использую 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; 
} 
+2

'ограничивать' не должно влиять на ваш выход. Только для компилятора возможны возможные оптимизации. Результаты могут быть одинаковыми и могут быть разными. – cshu

+0

Я думал, что в 'update_restrict' значение * c останется неизменным после того, как * a будет изменен, так как он загружается только один раз. Я не вижу, как это не может повлиять на результаты. –

+1

Вы не сказали, как вы компилируете (версия компилятора, флаги командной строки и т. Д.). Gcc имеет слабую интерпретацию значения ограничения: обозначение одного ограничения переменной практически бесполезно с gcc, оно предполагает, что две переменные, которые ** оба ** ограничены, не являются псевдонимами. Кроме того, компилятор может очень хорошо встроить функции, которые могут заставить проблему исчезнуть. Используйте '__attribute __ ((noinline, noclone))' on update_restrict, чтобы этого избежать. –

ответ

1

About the usage of restrict

От wikipedia.org:

Если декларация о намерениях не последует и объект доступ к независимым указателем, то это приведет к непредсказуемому поведению .

Эта линия update_restrict(&a, &b, &a); приводит к непредсказуемому поведению .

Результаты могут быть одинаковыми, и это может быть не так.

 Смежные вопросы

  • Нет связанных вопросов^_^