Hallo, eine Frage, wie kann ich möglichst schnell ein komplettes Array "löschen"(d.h. Speicherzelleln auf 0x00 setzen)? bei der Initialisierung/Deklarierung funktioniert das ja so, volatile unsigned char data_array[7] ={0,0,0,0,0,0,0}; aber danach? ist dies die einzige Möglichkeit? for(i=7;i;i--) data_array[i-1] =0; Danke und Grüße
So:
1 | memset(data_array, 0, sizeof (data_array)); |
(wenn data_array wirklich als Array deklariert und kein Zeiger ist) oder so:
1 | memset(data_array, 0, sizeof (unsigned char) * 7); |
(dann kann data_array ein Pointer sein, aber das ist wegen der nun erforderlichen Angabe der Anzahl der Arrayelemente unelegant und eine potentielle Fehlerquelle)
Danke Rufus, ich hab mir mal beide Versionen in ASM angesehen, und denke, dass meine zugegebener Maßen unelegantere Schneller ist und dazu auch noch ca. 1/3 kürzer. Das Verhältnis ändert sich natürlich zu meinen Ungunsten, wenn ich viele verschiedene Arrays mit verschiedenen Größen und dazu dann noch oft rücksetzen möchte. Gruß
Das dürfte stark von der Implementierung von memset abhängen. Ansonsten könnte Deine Schleife, wenn sie
1 | for (i = 0; i < 7; i++) |
2 | data_array[i] = 0; |
formuliert ist, möglichweise etwas schneller werden, da beim Arrayzugriff in der Schleife keine Subtraktion mehr erforderlich ist. Kann natürlich sein, daß das ein optimierender Compiler selber hinbekommt.
Bei AVRs ist es manchmal besser mit Pointern zu arbeiten, denn *mem++=0 kann der Compiler in st Z+, r24 umsetzen und mem[i]=0 wird worst case zu einer Addition von Arrayadresse und Offset und anschließenden st Z+, r24.
> So sollte es eigentlich von vornherein memset machen ...
Ich habs zwar (noch) nicht geprüft, aber das
der Compiler bei memset schlechteren Code als
mit einer popeligen Schleife generiert mag ich
kaum glauben.
Ev. Optimizer nicht eingeschaltet?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.