Detected loop counting up. Recommend loops count down as detecting zeros is easier

Gast
;-)

Danke dir, mal sehen, ob ich irgendwie an das Resultat herankomme.
Und ob ihm eine Subtraktion des Index besser schmeckt.

Oder ich ignoriere ihn und konzentriere mich auf's Programm..
Persönliche Seite
Sorry, das ist Quark und dient nur dazu, den Hinweis abzustellen. Du 
sparst jeweils einen Takt, musst aber den wieder spendieren, um die 
Addition von *parr zu rechnen. Und verbrauchst außerdem ein Wort extra.

Außerhalb von zeitkritischen ISRs kann man den Hinweis i.d.R. getrost 
ignorieren. Dafür sollte man sich beim Optimieren genau anschauen, was 
der Compiler treibt. Der TI-Compiler ist alles andere als fehlerfrei :(
Max G. schrieb:
> Sorry, das ist Quark und dient nur dazu, den Hinweis abzustellen. Du
> sparst jeweils einen Takt, musst aber den wieder spendieren, um die
> Addition von *parr zu rechnen. Und verbrauchst außerdem ein Wort extra.

Wobei solche Kalkulationen auf Hochsprachenbasis nicht notwendigerweise 
dem entsprechen, was hinten aus dem Compiler rauskommt. Hochoptimierende 
Compiler wie GCC erzeugen in beiden Beispielen den gleichen Code (bei 
-O2).

Ob also ein Index im Quelltext inkrementiert oder dekrementiert wird ist 
ihm egal, im erzeugten Code gibt es keinen Index, statt dessen wird in 
beiden Fällen ein Pointer inkrementiert und verglichen. Entspricht:
  uint8_t *parr = array;
  do {
    function(*parr);
  } while (++parr != array+14);
Gast
Ein Compiler der sagt:
"Ich weiss was Du willst, bin aber zu blöd, das in Assembler umzusetzen. 
Bitte hilf mir".
Naja, wenigstens ehrlich, die Entwickler!
Gast
Darfst du denn überhaupt die Reihenfolge des Durchlaufs umdrehen? Was 
macht denn function(.)?

Falls function(.) frei von Seiteneffekten ist und dessen Output nur von 
den Eingangswerten abhängt, dann gebe ihr das Attribut "pure". DANN darf 
der Compiler das auch selbst umdrehen. (ob er es macht, ist eine andere 
Frage. Da spielen noch mehr sachen mit rein).
meckerziege schrieb:
> Darfst du denn überhaupt die Reihenfolge des Durchlaufs umdrehen? Was
> macht denn function(.)?

Die Reihenfolge der Funktionsaufrufe darf er normalerweise nicht 
umdrehen (Ausnahmen siehe z.B. meckerziege, oder bei Inlining). Die 
Werteabfolge einer Zählvariablen hingegen schon, wenn das keine 
Auswirkung auf die Reihenfolge der Funktionsaufrufe oder anderen Code 
hat, weil er für das Array eine andere Lösung hat. Ebenso kann er die 
Zählvariable selbst komplett eliminieren.

Der Code im Startbeitrag ist eine klassische Zählschleife mit Verwendung 
als Index. Ein guter Compiler wird darin erkennen, dass die Schleife 14x 
ausgeführt wird und das Array aufsteigend ab 0 indiziert wird. Wie er 
das dann implementiert ist allein seine Sache, da die Zählvariable 
nirgends sonst verwendet wird (wobei ich annehme, sie ist lokal 
definiert, nicht global).

Daumenregel: Wenn als Ergebnis von erzeugten Code das rauskommt, was 
unter Anwendung der Regeln von C rauskommen darf, darf er machen was er 
will. Wobei mit und ohne Optimierung auch verschiedene Ergebnisse 
rauskommen dürfen, wenn beide in diesem Sinn zulässig sind.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.