Diese beiden Konstrukte haben eine sehr unterschiedliche Bedeutung. Die erste verwendet eine memset
Funktion, mit der ein Speicherpuffer auf einen bestimmten Wert gesetzt werden soll . Der zweite, der ein Objekt initialisiert . Lassen Sie es mich mit ein bisschen Code erklären:
Nehmen wir an, Sie haben eine Struktur, die nur Mitglieder von POD-Typen enthält ("Einfache alte Daten" - siehe Was sind POD-Typen in C ++? )
struct POD_OnlyStruct
{
int a;
char b;
};
POD_OnlyStruct t = {};
POD_OnlyStruct t;
memset(&t, 0, sizeof t);
In diesem Fall macht das Schreiben eines POD_OnlyStruct t = {}
oder POD_OnlyStruct t; memset(&t, 0, sizeof t)
keinen großen Unterschied, da der einzige Unterschied, den wir hier haben, darin besteht, dass die Ausrichtungsbytes im Falle der memset
Verwendung auf den Wert Null gesetzt werden. Da Sie normalerweise keinen Zugriff auf diese Bytes haben, gibt es für Sie keinen Unterschied.
Da Sie Ihre Frage als C ++ markiert haben, versuchen wir ein anderes Beispiel mit anderen Mitgliedstypen als POD :
struct TestStruct
{
int a;
std::string b;
};
TestStruct t = {};
{
TestStruct t1;
memset(&t1, 0, sizeof t1);
}
In diesem Fall ist die Verwendung eines Ausdrucks wie TestStruct t = {}
gut, und die Verwendung eines memset
on führt zum Absturz. Folgendes passiert, wenn Sie Folgendes verwenden memset
: Es wird ein Objekt vom Typ TestStruct
erstellt, wodurch ein Objekt vom Typ erstellt wird std::string
, da es Mitglied unserer Struktur ist. Als nächstes wird memset
der Speicher, in dem sich das Objekt b
befand, auf einen bestimmten Wert gesetzt, z. B. Null. Sobald unser TestStruct-Objekt den Gültigkeitsbereich verlässt, wird es zerstört und wenn der Zug zu seinem Mitglied kommt std::string b
, wird ein Absturz angezeigt , da alle internen Strukturen dieses Objekts durch das zerstört wurden memset
.
Die Realität ist also, dass diese Dinge sehr unterschiedlich sind , und obwohl Sie memset
in bestimmten Fällen manchmal eine ganze Struktur auf Null setzen müssen, ist es immer wichtig sicherzustellen, dass Sie verstehen, was Sie tun, und keinen Fehler wie in unserem zweiten machen Beispiel.
Meine Stimme - Einsatz memset
auf Objekte nur , wenn es erforderlich ist, und verwenden Sie die Standard - Initialisierung x = {}
in allen anderen Fällen.