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;
}
'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
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. –
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. –