Question

J'ai une compréhension générale de restrict mais j'espère clarifier certains points. J'ai une fonction qui lit une chaîne à zéro terminal dans un tampon et écrit une version encodée en URL dans un autre tampon. La fonction a cette signature (actuellement sans restreindre ):

char const *StringUrlEncode(char const *unencoded, 
                            char *encoded,
                            char *encodedEnd);

non codé est ma chaîne source terminée par un zéro. Le tampon de destination est représenté par codé et codéEnd , où codé pointe sur le premier char dans le tampon et < code> encodedEnd pointe sur le premier caractère après le tampon, c’est-à-dire que la fonction écrira char jusqu'à, mais ne comprend pas le emplacement désigné par encodedEnd - il s'agit de votre paire d'itérateurs de base begin / end si vous connaissez les conventions C ++ STL.

Si j'ajoute restreindre à cette fonction, ne devrait-elle s'appliquer qu'aux deux premiers paramètres:

char const *StringUrlEncode(char const *restrict unencoded, 
                            char *restrict encoded,
                            char *encodedEnd);

ou y a-t-il un avantage que je ne comprends pas en l'ajoutant aux trois paramètres?

Je peux voir que rendre les tampons d'entrée et de sortie restrict aide le compilateur à comprendre qu'ils ne se chevauchent pas. Mais puisque le dernier paramètre, encodedEnd , n'est utilisé que pour marquer la fin du tampon de sortie, je pense que restreindre ne serait pas vraiment une aide pour le compilateur ici (bien que je suppose que cela ne ferait pas de mal, mis à part l'ajout de bruit inutile dans la déclaration de fonction).

Était-ce utile?

La solution

Essayez l'article de Mike Acton ici . Restrict est effrayant à la fois par les implications de ne pas l’utiliser et par les conséquences d’une mauvaise utilisation.

Dans votre cas, il semblerait que vous puissiez appliquer en toute sécurité une restriction aux trois pointeurs, car aucun alias ne contient la même zone mémoire. Cependant, son utilisation sur le troisième pointeur ne présentera que peu, voire aucun avantage en termes de performances.

Autres conseils

Dans ce cas particulier, le fait que encodedEnd soit restreint ou non ne changera rien. vous avez promis au compilateur que personne ne créerait un alias non codé et codé , afin que les lectures et les écritures ne se gênent pas.

La vraie raison pour laquelle restreindre est important dans ce cas est que sans cela, le compilateur ne peut pas savoir que l'écriture via encoded n'affectera pas les lectures via non encodé . Par exemple, si

encoded == unencoded+1

chaque écriture dans codé affectera chaque lecture ultérieure de non codée , de sorte que le compilateur ne peut pas planifier le chargement tant que l'écriture n'est pas terminée. restrict promet au compilateur que les deux pointeurs n’affectent pas la même mémoire, ce qui lui permet de planifier les charges suffisamment à l’avance pour éviter les blocages de pipeline.

Je pense que vous avez raison, cela ne ferait pas de mal. Votre pointeur de boucle (appelez-le p) sera égal à encodedEnd à la fin de la boucle. Mais rien ne doit être accédé après la boucle (à partir de p ou de encodedEnd), cela ne devrait donc pas poser de problème. Je ne pense pas que cela aidera, car rien n’est jamais écrit ni lu à partir de encodedEnd, il n’ya donc rien à optimiser.

Mais je suis d’accord avec vous pour dire que les deux premières restrictions devraient vraiment aider.

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