35 Stimmen

Gibt es memset(), die ganze Zahlen größer als char akzeptiert?

Gibt es eine Version von memset(), die einen Wert setzt, der größer als 1 Byte (char) ist? Nehmen wir zum Beispiel an, wir haben eine Funktion memset32(), mit der wir Folgendes tun können:

int32_t array[10];
memset32(array, 0xDEADBEEF, sizeof(array));

Dadurch wird der Wert 0xDEADBEEF in allen Elementen des Arrays gesetzt. Derzeit scheint es mir, dies kann nur mit einer Schleife getan werden.

Konkret bin ich an einer 64-Bit-Version von memset() interessiert. Kennen Sie so etwas?

2voto

Cosmin Punkte 121

Wenn Sie nur auf einen x86-Compiler abzielen, könnten Sie etwas wie (VC++ Beispiel) versuchen:

inline void memset32(void *buf, uint32_t n, int32_t c)
{
  __asm {
  mov ecx, n
  mov eax, c
  mov edi, buf
  rep stosd
  }
}

Ansonsten machen Sie einfach eine einfache Schleife und vertrauen Sie darauf, dass der Optimierer weiß, was er tut, etwa so:

for(uint32_t i = 0;i < n;i++)
{
  ((int_32 *)buf)[i] = c;
}

Wenn Sie es kompliziert machen, ist die Wahrscheinlichkeit groß, dass es am Ende langsamer wird als ein einfach zu optimierender Code, ganz zu schweigen davon, dass er schwieriger zu warten ist.

1voto

kervin Punkte 11462

Sie sollten wirklich den Compiler dies für Sie optimieren lassen, wie jemand anderes vorgeschlagen hat. In den meisten Fällen wird diese Schleife vernachlässigbar sein.

Aber wenn es sich um eine besondere Situation handelt und es Ihnen nichts ausmacht, plattformspezifisch zu sein, und Sie die Schleife wirklich loswerden müssen, können Sie dies in einem Assembly-Block tun.

//pseudo code
asm
{
    rep stosq ...
}

Sie können wahrscheinlich stosq assembly command für die Einzelheiten googeln. Es sollte nicht mehr als ein paar Zeilen Code sein.

-1voto

easeout Punkte 8603

Schreiben Sie Ihre eigene; es ist sogar in asm trivial.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X