struct variable initialized with void.

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Mar 31 10:50:14 PDT 2015


On 3/31/15 11:23 AM, Adam D. Ruppe wrote:
> On Tuesday, 31 March 2015 at 15:12:54 UTC, ref2401 wrote:
>> Could anyone describe me what this initialization does, please?
>
> It skips the initialization entirely, leaving the memory random instead
> of making it zeroes (or NaN or whatever the .init is of the actual type,
> typically zero though).
>
> The struct members will thus be random when made with =void. However, it
> does tell the compiler that you thought about initializing it - you tell
> it you specifically want it uniniitalized and didn't just forget to
> write something.
>
>> When do I need to use the void initialization?
>
> Very rarely, don't use it unless you can answer this yourself.
>
> But some possible answers would be:
>
> 1) the initialization wasted program runtime; it can be an optimization.
> Only use it in this case if you are sure it matters (the speed was
> actually a problem) and if you do initialize it yourself immediately
> afterward. Otherwise, you might be introducing bugs.
>
> 2) you want some kind of random data, like if you are using it to seed a
> random number. There's often better ways of doing this, but =void might
> work in some cases.

Stack data is almost never random. I'd also substitute "often" for "always".

>
> 3) You are initializing a private member with default construction
> turned off. Here, "Struct s;" wouldn't compile because of the disabled
> default constructor, but you need to set it up anyway. So you do "Struct
> s = void; s.values = something;" - void to tell the compiler you know
> what you're doing, then you quickly initialize it to what it needs to
> be.  I say in a private member because you'd be bypassing the object's
> requirements this way, so you are responsibile for making sure the
> values are indeed valid before using the object.

4) initialization depends on runtime logic, but you want to scope the 
variable outside those conditionals. For example:

Struct s = void;

if(somecond)
{
    s = option1;
}
else
{
    s = option2;
}

// need to use s out here

Of course, this is a ridiculous example, a real example would be more 
complex (generally your logic is difficult to rework coupled with other 
code). This doesn't happen very often, but it is really the only time I 
have used the =void expression.

-Steve


More information about the Digitalmars-d-learn mailing list