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