www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 16508] New: Alignment of class members is not respected.


          Issue ID: 16508
           Summary: Alignment of class members is not respected. Affects
                    new, scoped and classInstanceAlignment.
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P1
         Component: druntime
          Assignee: nobody puremagic.com
          Reporter: Marco.Leise gmx.de


    class A
        align(8192) ubyte[0x400000] i;

    class B : A
        import core.simd;
        void16 giveMeMyAlignment;

    void main()
        import std.stdio, std.traits;
        writeln(cast(void*)new B);

Class B's alignment is 8192 (0x2000), but the program output is:


This indicates that the alignment directive is silently ignored for `new` and
that we have no access to the actual member alignment through compile-time
reflection. I had to pick a fantasy alignment here, as otherwise the pointers
are always rounded to a value larger than the alignment.

We need a way to get at the actual effective class instance alignment at
compile time and possibly feed that as a compile-time constant into the
`align()` directive for efficient `scoped` implementations.

Before anyone asks, the `scope` keyword to place objects on the stack is also
affected. But that's a general problem with current dmd, that doesn't support
stack alignments > 16 bytes. See:

Sep 18 2016