Ces deux constructions sont très différentes dans leur signification. Le premier utilise une fonction memset
, qui est destinée à définir un tampon mémoire sur une certaine valeur. Le deuxième pour initialiser un objet. Laissez-moi vous expliquer cela avec un peu de code :
Supposons que vous avez une structure qui a des membres uniquement de types POD ("Plain Old Data" - voir Quels sont les types POD en C++?)
struct StructurePOD_Seul
{
int a;
char b;
};
StructurePOD_Seul t = {}; // OK
StructurePOD_Seul t;
memset(&t, 0, sizeof t); // OK aussi
Dans ce cas, écrire un StructurePOD_Seul t = {}
ou StructurePOD_Seul t; memset(&t, 0, sizeof t)
ne fait pas beaucoup de différence, car la seule différence que nous avons ici est que les octets d'alignement sont définis sur une valeur zéro en cas d'utilisation de memset
. Comme vous n'avez normalement pas accès à ces octets, il n'y a pas de différence pour vous.
D'un autre côté, comme vous avez étiqueté votre question comme étant en C++, essayons un autre exemple, avec des types de membres différents des POD:
struct StructureTest
{
int a;
std::string b;
};
StructureTest t = {}; // OK
{
StructureTest t1;
memset(&t1, 0, sizeof t1); // ruine le membre 'b' de notre structure
} // L'application plante ici
Dans ce cas, utiliser une expression comme StructureTest t = {}
est bien, et utiliser un memset
sur cela entraînera un crash. Voici ce qui se passe si vous utilisez memset
- un objet de type StructureTest
est créé, créant ainsi un objet de type std::string
, puisque c'est un membre de notre structure. Ensuite, memset
définit la mémoire où l'objet b
était situé sur une certaine valeur, disons zéro. Maintenant, une fois que notre objet StructureTest sort du contexte, il sera détruit et lorsque viendra le tour de son membre std::string b
, vous verrez un crash, car toutes les structures internes de cet objet ont été ruinées par le memset
.
Donc, en réalité, ces choses sont très différentes, et bien que parfois vous ayez besoin de memset
une structure entière sur des zéros dans certains cas, il est toujours important de s'assurer de bien comprendre ce que vous faites, et de ne pas commettre d'erreur comme dans notre deuxième exemple.
Mon conseil - utiliser memset
sur des objets uniquement si c'est nécessaire, et utiliser l'initialisation par défaut x = {}
dans tous les autres cas.
0 votes
Cette Comment répondre[1] à une question ultérieure semble être plus utile et plus facile. [1]: stackoverflow.com/questions/4625212/class-initialization-list/t/…