On 28/12/2010 07:41, Robert Jacques wrote:
<snip>
As per the docs, align behaves in the manner of the companion C++
compile. DMC only defines align(1) and align(4), so they're the only two
that work.
<snip>

But what is meant to happen if an alignment the companion C compiler doesn't support is used? I would think not just silently ignore it.

See also
http://www.digitalmars.com/d/archives/digitalmars/D/Spec_of_align_attribute_is_a_mess_88129.html

In fact, it's for a different reason that it doesn't work in this instance. Consecutive byte members are always packed, regardless of the alignment setting. Other members smaller than the alignment setting are packed in a similar way. Try this at home:

struct Temp {
    ubyte x;
    align(16) cdouble y;
}
pragma(msg, Temp.y.offsetof);

and likewise for align values 1, 2, 4 and 8.

By my experiments, it seems the maximum alignment for a given type is:
- for primitive types except real and creal, the type's size
- for real and creal, 2
- for static arrays, the element type's maximum alignment
- for all reference types, 4 (presumably always the platform pointer size)
- for structs, the highest maximum alignment of any member

Of course, other compilers may do it differently.

Stewart.

Reply via email to