On Thursday, 17 May 2012 at 04:16:10 UTC, Andrew Wiley wrote:
On Wed, May 16, 2012 at 11:07 PM, H. S. Teoh <hst...@quickfur.ath.cx> wrote:
Do unions suffer from this problem? Could this prevent alignment
problems:

       short bytesToShort(ubyte[] b)
       in { assert(b.length==2); }
       body {
               union U {
                       short val;
                       ubyte[2] b;
               }
               U u;

               u.b[] = b[];
               return u.val;
       }

?


As I understand it, this should be fine because the compiler will guarantee that the union is aligned to the maximum alignment required by one of its members, which is the short. This is probably the safest solution.

And what about the following code:

// This implementation is optimized for speed via swapping
endianness in-place
pure immutable(C)[] fixEndian(C, Endian blobEndian =
endian)(ubyte[] blob) if(is(CharTypeOf!C))
{
     import std.bitmanip, std.system;
     auto data = cast(C[]) blob;
     static if(blobEndian != endian)
     {
         static assert(!is(typeof(C) == char)); // UTF-8 doesn't
have endianness
         foreach(ref ch; data) ch = swapEndian(ch);
     }
     return cast(immutable) data;
}

Reply via email to