2015-04-28 2 views
1

J'utilise mingw32-gcc, avec la norme C99. J'ai collé le code ci-dessous avec quelques modifications d'un article sur le mot-clé restrict - http://wr.informatik.uni-hamburg.de/_media/teaching/wintersemester_2013_2014/epc-1314-fasselt-c-keywords-report.pdf. Selon l'auteur, "Result One" et "Result Two" devraient être différents, mais quand je l'exécute, ils sont les mêmes. Je ne reçois aucun avertissement de compilateur. Y a-t-il des paramètres qui me manquent?Restriction: le mot clé ne fonctionne pas?

#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

'restrict' ne doit pas affecter votre sortie. C'est seulement pour le compilateur de faire des optimisations possibles. Les résultats peuvent être les mêmes et peuvent être différents. – cshu

+0

Je pensais que dans 'update_restrict' la valeur de * c resterait la même après * a est changé, car il est seulement chargé une fois. Je ne vois pas comment cela ne peut pas affecter les résultats. –

+1

Vous n'avez pas dit comment vous compilez (version du compilateur, drapeaux de ligne de commande, etc). Gcc a une interprétation faible de la signification de restrict: le marquage d'une seule variable variable est essentiellement inutile avec gcc, il suppose seulement que 2 variables qui sont ** both ** restrict ne sont pas des alias. En outre, le compilateur peut très bien intégrer les fonctions, ce qui pourrait faire disparaître le problème. Utilisez '__attribute __ ((noinline, noclone))' sur update_restrict pour éviter cela. –

Répondre

1

About the usage of restrict

De wikipedia.org:

Si la déclaration d'intention n'est pas respectée et l'objet est accessible par un pointeur indépendant, cela se traduira par un comportement non défini .

Cette ligne update_restrict(&a, &b, &a); résultats dans un comportement non défini.

Les résultats peuvent être identiques et ne pas être identiques.