devxlogo

Assigning a Zero Value to All Members of a Struct

Assigning a Zero Value to All Members of a Struct

Sometimes you need to clear all the members of a struct after it was used. With large structs, you usually use memset() for that purpose. However, for smaller structs that occupy 2, 4 or 8 bytes of memory, calling memset() is rather expensive in terms of performance:

   struct Date  {    char day;    char month;    short year;  }; // Date occupies 4 bytes  Date d;  d.day = 13; d.month = 4; d.year = 2000; // use d  memset(&d, 0, sizeof (d)); // now clear it

You can avoid the overhead of calling memset() by using the following technique instead:

     // convert a pointer to d to a pointer to int  int * pfake = reinterpret_cast  (&d); // 1    // assigns all d's members to zero through fake ptr  *pfake = 0; // 2

The first line of code creates a pointer to int (assuming 32-bit int size) that actually points to a Date object, d. Of course, cheating is necessary to convince the compiler to accept this conversion. This is why reinterpret_cast is used. The second line dereferences that fake int pointer and writes the value 0 to its memory block. This ensures that all the bits in d are set to zero.

You can perform this two-step operation in a single statement like this:

   *( reinterpret_cast  (&d) ) = 0;

However, this is less readable and more error prone.

devx-admin

Share the Post: