On Thu, May 12, 2016 at 08:41:25AM +0000, John Burton via Digitalmars-d wrote:
> I've been unable to find a clear definitive answer to this so please
> point me to one if it already exists in the manual or the forums.
> 
> Is it safe to cast pointer types?
> 
>     double data;
>     long p = *cast(long*)&data;
> 
> (Excuse any silly syntax errors as I'm doing this on my phone).
> 
> This used to be possible in C until people recently decided it not only was
> wrong, it had always been wrong :P (Ok I'm not entirely serious there but
> that's what this issue feels like...)
> 
> Is this legal / valid in D and if not what is the appropriate way to
> efficiently access data like this?

AFAIK this is legal in D, though it does break @safe-ty so it can only
be used in @system code.

An alternative is to use a union:

        long reinterpretAsLong(double data) @safe {
                union U { double d; long l; }
                U u;
                u.d = data;
                return u.l;
        }

A bit verbose, but disassembly shows that the dmd -O is able to reduce
it to a single mov instruction, as it should be.


T

-- 
English is useful because it is a mess. Since English is a mess, it maps well 
onto the problem space, which is also a mess, which we call reality. Similarly, 
Perl was designed to be a mess, though in the nicest of all possible ways. -- 
Larry Wall

Reply via email to