Saltar al contenido

memset () o inicialización de valor para poner a cero una estructura?

Por fin después de mucho trabajar pudimos dar con el arreglo de este apuro que agunos lectores de nuestro espacio han presentado. Si tienes algún detalle que aportar no dudes en compartir tu comentario.

Solución:

Esos dos construyen un muy diferentes en su significado. El primero utiliza un memset función, que tiene por objeto establecer un búfer de memoria a cierto valor. el segundo a inicializar un objeto. Déjame explicarlo con un poco de código:

Supongamos que tiene una estructura que tiene miembros solo de tipos POD (“Datos antiguos sin formato” – consulte ¿Qué son los tipos de POD en C++?)

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 escribir un POD_OnlyStruct t = o POD_OnlyStruct t; memset(&t, 0, sizeof t) no hace mucha diferencia, ya que la única diferencia que tenemos aquí es el alineación bytes se establecen en valor cero en caso de memset usado. Dado que normalmente no tiene acceso a esos bytes, no hay diferencia para usted.

Por otro lado, dado que ha etiquetado su pregunta como C++, probemos con 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 usando una expresión como TestStruct t = es bueno, y usando un memset en él dará lugar a accidente. Esto es lo que sucede si usa memset – un objeto de tipo TestStruct se crea, creando así un objeto de tipo std::string, ya que es miembro de nuestra estructura. Próximo, memset establece la memoria donde el objeto b fue ubicado a cierto valor, digamos cero. Ahora, una vez que nuestro objeto TestStruct queda fuera del alcance, será destruido y cuando llegue el turno de su miembro std::string b verás un choque, ya que todas las estructuras internas de ese objeto fueron arruinadas por el memset.

Entonces, la realidad es, esas cosas son muy diferentes, y aunque a veces es necesario memset toda una estructura a ceros en ciertos casos, siempre es importante asegurarse de que comprende lo que está haciendo y no cometer un error como en nuestro segundo ejemplo.

Mi voto – usar memset en objetos solo si es necesario, y utilice el defecto inicialización x = en todos los otros casos.

Dependiendo de los miembros de la estructura, las dos variantes no son necesariamente equivalentes. memset establecerá la estructura en todos los bits cero, mientras que la inicialización del valor inicializará todos los miembros en el valor cero. El estándar C garantiza que estos sean los mismos solo para tipos integrales, no para valores de coma flotante o punteros.

Además, algunas API requieren que la estructura realmente se establezca en todos los bits cero. Por ejemplo, la API de socket de Berkeley usa estructuras polimórficamente, y allí es importante establecer realmente toda la estructura en cero, no solo los valores que son aparentes. La documentación de la API debería decir si la estructura realmente necesita ser todos bits cero, pero podría ser deficiente.

Pero si ninguno de estos, o un caso similar, se aplica, entonces depende de usted. Al definir la estructura, preferiría la inicialización del valor, ya que eso comunica la intención con mayor claridad. Por supuesto, si necesita poner a cero una estructura existente, memset es la única opción (bueno, además de inicializar cada miembro a cero a mano, pero eso normalmente no se haría, especialmente para estructuras grandes).

Si su estructura contiene cosas como:

int a;
char b;
int c;

Luego se insertarán bytes de relleno entre “b” y “c”. memset() los pondrá a cero, la otra forma no lo hará, por lo que habrá 3 bytes de basura (si sus ints son de 32 bits). Si tiene la intención de usar su estructura para leer/escribir desde un archivo, esto podría ser importante.

Aquí tienes las comentarios y puntuaciones

Al final de la artículo puedes encontrar las interpretaciones de otros gestores de proyectos, tú además puedes mostrar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *