Esas dos construcciones a muy diferentes en su significado. El primero utiliza una función memset
, que está destinada a establecer un búfer de memoria a cierto valor. El segundo a inicializa un objeto. Me explico con un poco de código:
Vamos a suponer que tiene una estructura que tiene miembros única de tipos de POD
struct POD_OnlyStruct
{
int a;
char b;
};
POD_OnlyStruct t = {}; // OK
POD_OnlyStruct t;
memset(&t, 0, sizeof t); // OK as well
En este caso, la escritura de un POD_OnlyStruct t = {}
POD_OnlyStruct t; memset(&t, 0, sizeof t)
o no hace mucha diferencia , ya que la única diferencia que tenemos aquí es la alineación de bytes que se establece en valor cero en el caso de memset
utilizado. Como no tiene acceso a esos bytes normalmente, no hay diferencia para usted.
Por otro lado, ya que lo ha insertado en cuestión como C++, vamos a probar otro ejemplo, con el miembro tipos diferentes de POD:
struct TestStruct
{
int a;
std::string b;
};
TestStruct t = {}; // OK
{
TestStruct t1;
memset(&t1, 0, sizeof t1); // ruins member 'b' of our struct
} // Application crashes here
En este caso utilizando una expresión como TestStruct t = {}
es bueno y usar un memset
en él provocará un bloqueo. Esto es lo que sucede si usa memset
- se crea un objeto de tipo TestStruct
, creando así un objeto de tipo std::string
, ya que es un miembro de nuestra estructura. A continuación, memset
establece la memoria donde se encuentra el objeto b
a cierto valor, digamos cero. Ahora, una vez que nuestro objeto TestStruct quede fuera del alcance, se destruirá y cuando llegue el turno a su miembro std::string b
verá un bloqueo, ya que todas las estructuras internas de ese objeto se arruinaron con el memset
.
Por lo tanto, la realidad es, esas cosas son muy diferentes, y aunque a veces es necesario memset
toda una estructura de ceros en ciertos casos, siempre es importante asegurarse de que entiende lo que está haciendo, y no cometer un error como en nuestro segundo ejemplo.
Mi voto - memset
utilizar en objetos solamente si es necesario, y utilizar la inicialización por defecto x = {}
en todos los demás casos.
Esta [respuesta] [1] a una pregunta posterior parece ser más útil y más fácil. [1]: http://stackoverflow.com/questions/4625212/class-initialization-list/4625730#4625730 – TheMatto