Casting Pointers?

H. S. Teoh via Digitalmars-d digitalmars-d at puremagic.com
Thu May 12 07:17:46 PDT 2016


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


More information about the Digitalmars-d mailing list