Wann memset und wann ZeroMemory??
-
Optimizer: Geistreiche Antwort :p
/me würde sagen, für memset spricht:
- Portabilität (ist Standard-C++), ZeroMemory ist eine WinAPI-Funktion
- manchmal als intrinsic implementiert -> schneller als ein API-Aufruf
-
Nur zur Info:
ZeroMemory ist ein Makro, dass zu memset() expandiert
-
oh
-
danke, für die antworten.. ich frag deshalb, weil ich irgendwo mal gelesen habe, dass man char[BUFFER]- Variablen mit memset() bzw ZeroMemory initialisieren soll, bevor man sie verwendet. Stimmt das??
tausend dank
TObi
-
tobi schrieb:
Stimmt das??
Nein. Pauschalaussagen sind immer falsch.
-
ja. wie initialsier ich denn dann die char-array richtig?? reicht es zu sagen:
(...) char szString [12]; (..)
kann ich dann gefahrlos mit
zB:(..) char szNochEine[4]; CopyMemory(&szString[0],&szNochEine,2); (..)
darauf zugreifen?? oder sollte man doch erst mit ZeroMemory() einen definierten Anfangszustand herstellen? Oder ist es egal und einfach Geschmacksache??
so denn, sagt tobi
-
Es gibt keinen "richtigen" Weg. Ob und wie du initialisieren musst, hängt davon ab, was du mit dem Array vorhast. Wenn du wild Zeichen hineinkopieren willst und ohne, dass du selbst hinterher eine Terminierung reinsetzt, sichergehen willst, dass der Inhalt am Ende immer noch nullterminiert ist, dann solltest du den ganzen Array mit Nullen initialisieren.
-
Shade Of Mine schrieb:
Nur zur Info:
ZeroMemory ist ein Makro, dass zu memset() expandiertFalsch.
#define ZeroMemory RtlZeroMemory
-
expander schrieb:
Falsch.
Und was ist dann RtlZeroMemory?
Es ist ein makro für memset (x, 0, y).
-
randa schrieb:
Und was ist dann RtlZeroMemory?
Es ist ein makro für memset (x, 0, y).Nicht ausschliesslich. Bist du mal alle #ifdef Abschnitte durchgegangen?
@_tobi_
Wenn du einen C-String (char Array) als leer initialisieren willst, reicht einchar s[10]; s[0] = '\0';
vollkommen aus. Wozu das ganze Array abnullen, wenn du's hinterher eh wieder mit Nutzdaten befüllst.
Ansonsten kann ich mich der Meinung von Bashar nur anschliessen, nimm ausschliesslich memset und nicht ZeroMemory. Neben der Portabilität ist der grosse Vorteil dabei, dass viele Compiler diese Funktion intrinsic implementiert haben. Das musst du dir wie eine built-in Funktion des Compilers vorstellen, die er deinem Code entsprechend anpassen kann. Wenn du dem Compiler zB sagst, er soll CPU Erweiterungen nutzen (zB MMX oder SSE), dann wird memset halt mit Hilfe dieser CPU Befehle realisiert. Allerdings sind Compiler heutzutage in der Lage, solch simple Sachen über einfache Schleifen genauso gut zu implementieren. Vielleicht sollte man in diesem Zusammenhang auch mal einen Blick in <algorithm> riskieren.
-
schönen dank für die vielen guten antworten!
ich werd eure ratschläge gleich mal in die tat umsetzen!
god save this forum!
tobi
-
Wie genau funktioniert eine Funktion die intrinsic ist? Hat der Compiler da einfach mehrere Vorlagen von welchen er die für den Fall schnellste verwendet?
-
Das hängt sicherlich vom Compilerhersteller ab. Am wahrscheinlich sinnvollsten ist es, wenn man sowas dynamisch anpasst, weil man damit einfach flexibler ist. Deshalb gibt es wohl auch nur sehr simple Funktionen, die als intrinsic implementiert werden, wie zB memcpy, memset oder strlen.
-
Einfache Möglichkeit:
char foo[23] = {0};
Sinnvolle Möglichkeit:
#include <string> //... std::string foo;
Das hier ist immerhin das C++-Forum, da kann man auch C++-Code benutzen.