Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Home » Tip Bank » C++
Language: C++
Expertise: All
Dec 10, 1999

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 <int*> (&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 <int*> (&d) ) = 0;
However, this is less readable and more error prone.
Danny Kalev
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap
Thanks for your registration, follow us on our social networks to keep up-to-date