Forum: Compiler & IDEs Array zurücksetzen auf default


von Quacks (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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)

von Quacks (Gast)


Lesenswert?

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ß

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Benedikt K. (benedikt)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

So sollte es eigentlich von vornherein memset machen ...

von Karl heinz B. (kbucheg)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.