Quand utiliser restreindre et quand ne pas

J’ai une compréhension générale de ressortingct 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 ressortingct ):

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

unencoded est ma chaîne source terminée par un zéro. Le tampon de destination est représenté par encodedEnd et encodedEnd , où encodedEnd pointe sur le premier caractère du tampon et encodedEnd pointe sur le premier caractère après le tampon, c’est-à-dire que la fonction écrit les caractères jusqu’en encodedEnd l’emplacement indiqué par encodedEnd – – Il s’agit de votre paire d’iterators de base begin / end si vous êtes familier avec les conventions C ++ STL.

Si j’ajoute ressortingct à cette fonction, ne devrait-elle s’appliquer qu’aux deux premiers parameters:

 char const *SsortingngUrlEncode(char const *ressortingct unencoded, char *ressortingct encoded, char *encodedEnd); 

ou y a-t-il un avantage que je ne comprends pas en l’ajoutant aux trois parameters?

Je peux voir que le fait de ressortingct tampons d’entrée et de sortie aide le compilateur à savoir qu’ils ne se chevauchent pas. Mais comme le dernier paramètre, encodedEnd , n’est utilisé que pour marquer la fin du tampon de sortie, je pense que ressortingct ne serait d’aucune aide pour le compilateur ici (bien que je suppose que cela ne ferait pas de mal, à part l’ajout de bruit inutile à la déclaration de fonction).

Essayez l’article de Mike Acton ici . Restreindre est effrayant à la fois par les conséquences en termes de performances de ne pas l’utiliser et les conséquences d’une utilisation incorrecte.

Dans votre cas, il semble que vous puissiez appliquer en toute sécurité une ressortingction 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.

Dans ce cas particulier, encodedEnd est restreint ou pas; vous avez promis au compilateur que personne ne créerait des alias non codés et codés , de sorte que les lectures et les écritures n’interféreront pas les unes avec les autres.

La vraie raison pour laquelle ressortingct est important dans ce cas est que sans cela, le compilateur ne peut pas savoir que les écritures codées n’affecteront pas les lectures non codées . Par exemple, si

 encoded == unencoded+1 

alors chaque écriture dans encodé affectera chaque lecture ultérieure de non codée , ainsi le compilateur ne peut pas planifier le chargement jusqu’à la fin de l’écriture. ressortingct 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 (depuis p ou encodedEnd), cela ne devrait donc pas poser de problème. Je ne pense pas que cela va aider non plus, parce que rien n’est jamais écrit ou lu depuis encodedEnd, il n’y a donc rien à optimiser.

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