Question

Est-il possible de définir à l'aide typedef intégrale / type de flotteur qui implique pas aliasng?

quelque chose d'équivalent (mais construction primitive):

template < typename T >
struct restrict { T* __restrict data; };

question connexe, est-il possible de demander gcc ce qu'il détermine alias / non alias de pointeur est?

Était-ce utile?

La solution

Comme indiqué dans les commentaires, de nombreux nouveaux compilateurs C ++ prennent en charge la mise en œuvre de C99 du qualificatif de type restreindre. Puisque restrict n'est pas un mot-clé réservé en C ++, les compilateurs utilisent généralement __restrict ou __restrict__. Les deux GCC et Visual C ++ documenter ce bien, avec des références explicites à C99

Le C ++ 1998 états standard « Le spécificateur typedef ne doit pas ... être combiné dans un décl-spécificateur-seq avec tout type de prescripteur, sauf spécificateur-type « . Pour l'essentiel, il doit être une liste de de type spécificateurs , qui comprend les deux cv-qualifiés , const et volatile.

C99 définit typedef De la même façon, sauf que la liste des qualificatifs comprend restrict.

Il semble raisonnable de prévoir un soutien similaire à typedefs pour le __restrict ... mais non standard on ne sait jamais!

Une façon simple et brillante de tester cela est comme suit:

extern void link_fail();

typedef int *__restrict restricted_int_p;

void test(restricted_int_p a, restricted_int_p b) {
    *a = 1;
    *b = 2;

    if (*a == 2) link_fail();
}

exploite simplement le fait que si le symbole link_fail sans solution se trouve dans le fichier objet, l'éditeur de liens renvoie une erreur. Si le compilateur est correctement restreignait les deux arguments, alors il devrait connaître la valeur de a, même après b est modifié. Ainsi, il doit dépouiller l'ensemble si le bloc du fichier objet généré car il ne sera jamais exécuté.

Notez que bien que GCC pris en charge la syntaxe depuis au restreindre moins la version 3.0, il n'a pas vraiment effectuer les optimisations appropriées jusqu'à ce que version 4.5 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top