restrict
Section spécifique à Microsoft
Lorsqu’il est appliqué à une déclaration ou une définition de fonction qui retourne un type pointeur, restrict
indique au compilateur que la fonction retourne un objet qui n’est pas un alias qui est référencé par tout autre pointeur. Cela permet au compilateur d’effectuer des optimisations supplémentaires.
Syntaxe
__declspec(restrict)
pointer_return_type function();
Notes
Le compilateur propage __declspec(restrict)
. Par exemple, la fonction malloc
CRT a une décoration __declspec(restrict)
et, par conséquent, le compilateur suppose que les pointeurs initialisés vers des emplacements de mémoire par malloc
ne sont pas également des alias par des pointeurs existants.
Le compilateur ne vérifie pas que le pointeur retourné n’est pas réellement un alias. Il incombe au développeur de s’assurer que le programme n’attribue pas d’alias à un pointeur marqué avec le modificateur restrict __declspec.
Pour des sémantiques semblables concernant les variables, consultez __restrict.
Pour obtenir une autre annotation qui s’applique à l’alias dans une fonction, consultez __declspec(noalias).
Pour plus d’informations sur le mot clé restrict
qui fait partie de C++ AMP, consultez restrict (C++ AMP).
Exemple
L’exemple suivant illustre l’utilisation de __declspec(restrict)
.
Lorsque __declspec(restrict)
s’applique à une fonction qui retourne un pointeur, cela indique au compilateur que la mémoire vers laquelle pointe la valeur de retour n’a pas d’alias. Dans cet exemple, les pointeurs mempool
et memptr
sont globaux. Le compilateur ne peut ainsi pas être sûr que la mémoire à laquelle ils font référence n’est pas un alias. Toutefois, ils sont utilisés dans ma
et son appelant init
d’une manière qui retourne la mémoire qui n’est pas référencée par le programme. __decslpec(restrict) est ainsi utilisé pour aider l’optimiseur. Cela est similaire à la façon dont les en-têtes CRT décorent les fonctions d’allocation telles que malloc
par l’utilisation __declspec(restrict)
pour indiquer qu’elles retournent toujours la mémoire qui ne peut pas être un alias par des pointeurs existants.
// declspec_restrict.c
// Compile with: cl /W4 declspec_restrict.c
#include <stdio.h>
#include <stdlib.h>
#define M 800
#define N 600
#define P 700
float * mempool, * memptr;
__declspec(restrict) float * ma(int size)
{
float * retval;
retval = memptr;
memptr += size;
return retval;
}
__declspec(restrict) float * init(int m, int n)
{
float * a;
int i, j;
int k=1;
a = ma(m * n);
if (!a) exit(1);
for (i=0; i<m; i++)
for (j=0; j<n; j++)
a[i*n+j] = 0.1f/k++;
return a;
}
void multiply(float * a, float * b, float * c)
{
int i, j, k;
for (j=0; j<P; j++)
for (i=0; i<M; i++)
for (k=0; k<N; k++)
c[i * P + j] =
a[i * N + k] *
b[k * P + j];
}
int main()
{
float * a, * b, * c;
mempool = (float *) malloc(sizeof(float) * (M*N + N*P + M*P));
if (!mempool)
{
puts("ERROR: Malloc returned null");
exit(1);
}
memptr = mempool;
a = init(M, N);
b = init(N, P);
c = init(M, P);
multiply(a, b, c);
}
FIN de la section spécifique à Microsoft
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour