digitalmars.D.learn - Unions and array length...
- Era Scarecrow (30/30) Aug 14 2012 In the array structure, either the length is how many elements
In the array structure, either the length is how many elements of that type there are, or how many bytes total the array takes up. This can create a slight problem if used in a union (or so I've found). Currently this is how it works: union { ubyte[] ub; int[] i; } i = new int[8]; assert(i.length == 8); Since ints are 4 bytes... i[0 .. 8] = 84; //works as expected ub[0 .. 32] = 42; //range violation! If you write them with writeln you get a very specific picture. writeln(int.length); //8 as expected writeln(ub.length); //8, NOT 32 You've have to cast it to fix the length (but you can't recast over and over in a union). If it had the number of bytes, it would have a slight overhead (maybe 1 instruction at best as a shift operator in most cases) to translate it. If it was the number of bytes instead... i = new int[8]; //32 bytes assert(i.length == 8); assert(ub.length == 32); i[0 .. 8] = 84; //works as expected ub[0 .. 32] = 42; //range/length within byte size, so is okay Now other than getting the length slightly faster, is there any important reason why it's by how many and not how big the area holds?
Aug 14 2012