[Issue 16508] New: Alignment of class members is not respected. Affects new, scoped and classInstanceAlignment.
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Sun Sep 18 16:53:15 PDT 2016
https://issues.dlang.org/show_bug.cgi?id=16508
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 at puremagic.com
Reporter: Marco.Leise at gmx.de
Illustration:
class A
{
align(8192) ubyte[0x400000] i;
}
class B : A
{
import core.simd;
void16 giveMeMyAlignment;
}
void main()
{
import std.stdio, std.traits;
writeln(classInstanceAlignment!B);
writeln(cast(void*)new B);
}
Class B's alignment is 8192 (0x2000), but the program output is:
8
7FEAFA8DF000
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:
https://issues.dlang.org/show_bug.cgi?id=16098
--
More information about the Digitalmars-d-bugs
mailing list