Les processeurs sont connus pour avoir des instructions spéciales pour décrémenter un compteur et une branche si le compteur est nul avec une latence très faible car l'instruction de branchement n'a pas besoin d'attendre le compteur décrément passant à travers une unité entière.Comment écrire une boucle dans C afin que le compilateur utilise la branche sur zéro après la décrémentation
Voici un lien vers l'instruction ppc:
https://www.ibm.com/support/knowledgecenter/ssw_aix_53/com.ibm.aix.aixassem/doc/alangref/bc.htm
Ma façon habituelle de faire ce que je crois déclenche un compilateur pour générer les instructions appropriées se présente comme suit:
unsigned int ctr = n;
while(ctr--)
a[ctr] += b[ctr];
Lisibilité est haut et c'est une boucle de décrémentation ramifiée sur zéro. Comme vous voyez la branche se produit techniquement si le compteur est zéro avant la décrémentation. J'espérais que le compilateur pourrait faire de la magie et le faire fonctionner de toute façon. Q: Un compilateur doit-il casser les règles fondamentales de C afin de le réduire à des instructions spéciales de décrémentation et de branchement (le cas échéant)?
Une autre approche:
unsigned int ctr = n+1;
while(--ctr) {
a[ctr-1] += b[ctr-1];
}
La branche maintenant se produire après décrémentation mais il y a des constantes d'itinérance rend le code laid. Une variable "index" étant un de moins que le compteur ferait paraître un peu plus joli je suppose. En regardant les instructions ppc disponibles, le calcul supplémentaire de la recherche des adresses a et b peut toujours tenir compte d'une seule instruction, car la charge peut également effectuer une opération arithmétique (ajouter). Pas si sûr au sujet d'autres ensembles d'instructions. Mon problème principal est si n + 1 est plus grand qu'un max. Q: Le décrément le ramènera-t-il au maximum et à la boucle comme d'habitude?
Q: Y a-t-il un motif plus couramment utilisé en C pour permettre l'instruction commune? Edit: ARM a une opération de décrémentation et de branchement, mais ne se branche que si la valeur n'est pas zéro. Il semble y avoir une condition supplémentaire, tout comme le ppc bc. Comme je le vois, c'est du point de vue de C c'est à peu près la même chose, donc je m'attends à ce qu'un fragment de code soit compilable à cette forme aussi sans aucune violation de la norme C. http://www.heyrick.co.uk/armwiki/Conditional_execution
Edit: Intel a pratiquement la même instruction de branchement comme ARM: http://cse.unl.edu/~goddard/Courses/CSCE351/IntelArchitecture/InstructionSetSummary.pdf
La lisibilité est-elle élevée? La lisibilité est si élevée que les incréments/décréments avant/après ont été supprimés de Swift3. J'essaierais memcpy ou memmove. – gnasher729
Personnellement, je n'ai aucun problème avec pré/post incrément. memcpy/memmove n'est pas une option: il ne copie pas, il ajoute des valeurs ('+ =' au lieu de '='). – Aconcagua