December 14, 2006 Re: struct to byte[] | ||||
---|---|---|---|---|
| ||||
Posted in reply to Derek Parnell | == Quote from Derek Parnell (derek@nomail.afraid.org)'s article
> With this, the '&t' phrase takes the address of the data as
> passed-by-value. [...] So you end up with a ubyte[]
> array that references a copy of the struct/data you supplied
> [...] Of course, that might be what you are trying to do ;-)
I get it now! The kind of things I would use it for would only care about the copy from a performace standpoint.
OTOH: would this work?
ubyte [] toByteArray (T) (inout T t)
{
return (cast(ubyte *)&t)[0..T.sizeof].dup
}
|
December 15, 2006 Re: struct to byte[] | ||||
---|---|---|---|---|
| ||||
Posted in reply to BCS | On Thu, 14 Dec 2006 18:10:56 +0000 (UTC), BCS wrote: > == Quote from Derek Parnell (derek@nomail.afraid.org)'s article >> With this, the '&t' phrase takes the address of the data as >> passed-by-value. [...] So you end up with a ubyte[] >> array that references a copy of the struct/data you supplied >> [...] Of course, that might be what you are trying to do ;-) > > I get it now! The kind of things I would use it for would only care about the copy from a performace standpoint. > > OTOH: would this work? > > ubyte [] toByteArray (T) (inout T t) > { > return (cast(ubyte *)&t)[0..T.sizeof].dup > } LOL ... That is just *so* much better than my complex method. If you remove the '.dup', which gets the exact effect of my routine, your generated machine code is very optimized. Your version: mov EDX,EAX mov EAX,01Ch ret My version: enter 8,0 push EBX mov EDX,__init...ubyte_abi[04h] mov EBX,__init...ubyte_abi mov -8[EBP],EBX mov -4[EBP],EDX mov -4[EBP],EAX mov dword ptr -8[EBP],01Ch mov EDX,-4[EBP] mov EAX,-8[EBP] pop EBX leave ret So I'll stick to this now ... ubyte [] toByteArray (T) (inout T t) { return (cast(ubyte *)&t)[0..T.sizeof]; } -- Derek (skype: derek.j.parnell) Melbourne, Australia "Down with mediocrity!" 15/12/2006 12:00:30 PM |
Copyright © 1999-2021 by the D Language Foundation