primitive vector types
Daniel Keep
daniel.keep.lists at gmail.com
Thu Feb 19 22:42:52 PST 2009
Jarrett Billingsley wrote:
> On Thu, Feb 19, 2009 at 9:31 PM, Daniel Keep
> <daniel.keep.lists at gmail.com> wrote:
>>> struct float4
>>> {
>>> __align(16) float[4] data; // right syntax and value?
>>> alias data this;
>>> }
>
>> 1. The alignment thing. Incidentally, I just did a quick check and
>> don't see any notes in the changelog about __align(n) syntax. As I
>> remember, there was no way to actually ensure the data was properly
>> aligned. (There's "Data items in static data segment >= 16 bytes in
>> size are now paragraph aligned." but that doesn't help when the vectors
>> are on, say, the stack or in the heap.)
>
> It's just align(16).
>
> http://www.digitalmars.com/d/1.0/attribute.html#align
Yeah, except it doesn't do what you want in this case. For example:
module alignment;
import tango.io.Stdout;
struct float4
{
align(16) float[4] data;
}
void main()
{
float4 a;
byte b;
float4 c;
Stdout.format("a @ {0} & 0xF == {1}", &a, cast(size_t)&a & 0xF).newline;
Stdout.format("c @ {0} & 0xF == {1}", &c, cast(size_t)&c & 0xF).newline;
}
Output is:
a @ 12fe68 & 0xF == 8
c @ 12fe78 & 0xF == 8
The only way I found of guaranteeing alignment was to allocate all
vectors on the heap, using a custom allocator to allocate an extra 15
bytes and then align the result appropriately. Obviously, for 16-byte
vectors, this is completely unacceptable.
-- Daniel
More information about the Digitalmars-d
mailing list