Keine Ahnung. Warum aber C Code im Assemblercode stehen bleibt würde mich interessieren.
Wenn objdump.exe auch die Quellen sieht, kann es das.
Wurde zwischendurch die Quelle editiert (Modifiziert Datum Urzeit), dann ist Ende damit.
Diesmal komme ich allerdings zu einem anderen Ergebnis. ... Mit uint8, uint16, int16, uint32 und int32 kommt für mich gleicher kurzer Assemblercode raus.
Das ist das (für mich) erwartete Ergebnis!
Sämtliche Versuche, an der Stelle, irgendwas händisch zu optimieren, sind für die Katz.
Hier ein Extrembeispiel wie weit die Optimierung geht:
/**
* Das Programm toggelt, 6 mal den Pin 13 und bleibt
* dann in einer Endlosschleife stehen
*/
void tuwas()
{
PINB = _BV(PB5);
}
int main()
{
DDRB |= _BV(PB5);
for(int i = 0; i <= 5; i++)
{
tuwas();
}
while(1);
}
Generierter Code (ein Auszug, nur die Main):
00000080 <main>:
80: 25 9a sbi 0x04, 5 ; 4 // DDRB |= _BV(PB5);
82: 80 e2 ldi r24, 0x20 ; 32 // stopfe _BV(PB5) ins Register
84: 83 b9 out 0x03, r24 ; 3 // toggle
86: 83 b9 out 0x03, r24 ; 3 // toggle
88: 83 b9 out 0x03, r24 ; 3 // toggle
8a: 83 b9 out 0x03, r24 ; 3 // toggle
8c: 83 b9 out 0x03, r24 ; 3 // toggle
8e: 83 b9 out 0x03, r24 ; 3 // toggle
90: ff cf rjmp .-2 ; 0x90 <main+0x10> // while(1)
( die // Kommentare habe ich rein gesetzt)
Man sieht:
Die Schleifenvariable i ist völlig verschwunden.
tuwas() wurde 6 mal inline eingebunden. Kein Funktionsaufruf, kein push, pop, call und Return
Kompakter bekommt das kein Assemblerprogrammierer hin.
Da ist nichts mehr zu optimieren.
Es ist völlig egal, welchen Datentype man für die Laufvariable nimmt, da verschwunden.
Damit ist auch klar, dass die Eingangsfrage, im Kern, kaum berechtigt ist.
Das kann in jedem Kontext anders aussehen.
Man muss sich das schon oft angeschaut haben, was da passiert, um zu sehen, wie sich das auswirkt, was man mit/in der Quelle anrichtet.
Viel schauen, üben usw., dann entwickelt man auf Dauer eine Intuition für die Vorgänge.
Und es wird einem auch klarer, dass die Wahl des Datentypes, nicht unbedingt, eine Auswirkung auf die Performance hat. Oft ja, aber auch oft nein.
Ich ziehe die .elf Datei auf eine Batchdatei die dann objdump.exe aufruft und das Ergebnis als Textdatei speichert.
Ich habe meine Arduino IDE 1.8.7 überredet, mir bei jedem Kompilerlauf, einen solchen Assemblerdump zu produzieren. Voll automatisch.
Nachtrag:
Wenn man
#pragma GCC optimize ("O0")
an den Anfang der *.ino setzt, kann man schön sehen wie nicht optimierter Code aussieht.