Prozessoren sind bekannt, spezielle Anweisungen zum Dekrementieren eines Zählers und Verzweigung, wenn der Zähler Null ist mit sehr niedrigen Latenz, wie der Verzweigung Befehl nicht warten müssen das Zählerdekrement, das durch eine Integer-Einheit läuft. HierWie schreibt man Schleife in C so Compiler kann Verzweigung auf Null nach Dekrement verwenden
ist ein Link auf die ppc Anweisung:
https://www.ibm.com/support/knowledgecenter/ssw_aix_53/com.ibm.aix.aixassem/doc/alangref/bc.htm
Meine übliche Art und Weise zu tun, was ich glaube, löst einen Compiler die entsprechenden Anweisungen zu erzeugen, ist wie folgt:
unsigned int ctr = n;
while(ctr--)
a[ctr] += b[ctr];
Ablesbarkeit ist hoch und es ist eine dekrementierende Schleife, die auf Null verzweigt. Wie Sie sehen, tritt der Zweig technisch auf, wenn der Zähler vor dem Dekrement null ist. Ich hatte gehofft, der Compiler könnte etwas Magie machen und es trotzdem funktionieren lassen. F: Wäre ein Compiler gezwungen, irgendwelche fundamentalen Regeln von C zu brechen, um sie zu speziellen Dekrement- und Verzweigungs-bedingten Anweisungen (falls vorhanden) zu verändern?
Ein anderer Ansatz:
unsigned int ctr = n+1;
while(--ctr) {
a[ctr-1] += b[ctr-1];
}
Der Zweig jetzt nach Abnahme passieren, aber es gibt Roaming-Konstanten hässlich Code zu machen. Eine "Index" -Variable, die um eins kleiner ist als der Zähler, würde es etwas hübscher aussehen lassen, denke ich. Mit Blick auf verfügbare ppc-Anweisungen kann die zusätzliche Berechnung beim Finden der a- und b-Adresse immer noch für einen einzelnen Befehl passen, da Laden auch Adressarithmetik (addieren) ausführen kann. Nicht so sicher über andere Befehlssätze. Mein Hauptproblem ist jedoch, wenn n + 1 größer als ein max ist. F: Wird das Dekrement wie üblich zum Maximum und zum Loop zurückkehren?
F: Gibt es in C ein häufiger verwendetes Muster für die gemeinsame Anweisung?
Edit: ARM hat eine Dekrement- und Verzweigungsoperation, aber verzweigt nur, wenn der Wert NICHT Null ist. Es scheint eine zusätzliche Bedingung zu geben, genau wie die ppc bc. Wie ich es sehe, ist es vom C-Standpunkt aus gesehen dasselbe, also erwarte ich, dass ein Code-Snippet auch ohne C-Standard-Verletzung zu dieser Form kompilierbar ist. http://www.heyrick.co.uk/armwiki/Conditional_execution
Edit: Intel hat praktisch die gleiche Verzweigungsanweisung wie ARM: http://cse.unl.edu/~goddard/Courses/CSCE351/IntelArchitecture/InstructionSetSummary.pdf
Lesbarkeit ist hoch? Die Lesbarkeit ist so hoch, dass Pre/Post Inkrement/Dekrement aus Swift3 entfernt wurde. Ich würde versuchen Memcpy oder Memmove. – gnasher729
Ich persönlich habe kein Problem mit Pre/Post Inkrement. memcpy/memmove ist keine Option: Er kopiert nicht, er fügt Werte hinzu ('+ =' anstelle von '='). – Aconcagua