digitalmars.D.learn - Struct members align in DMD 2.060
- novice2 (59/59) Oct 06 2012 Some of my code broken in DMD 2.060.
- novice2 (2/2) Oct 06 2012 btw GDC and LDC 2.060 produces same output as DMD 2.060 at
- Maxim Fomin (6/6) Oct 06 2012 http://dlang.org/changelog.html
- novice2 (4/4) Oct 07 2012 Thanx Maxim,
- Maxim Fomin (10/14) Oct 07 2012 http://dpaste.dzfl.pl/57911897
- novice2 (3/3) Oct 07 2012 Thanx again.
- novice2 (2/3) Oct 07 2012 But, imho, this is "unproperly" to include something outside
- Maxim Fomin (4/7) Oct 07 2012 Strictly speaking, nothing special is included, just empty bytes
Some of my code broken in DMD 2.060.
I need packed struct without align to process data.
Is this bug or something changed in 2.060 ?
Code http://dpaste.dzfl.pl/212ca53b :
import std.stdio;
align(1) struct S1
{
char[2] c; //+0
uint u; //+2
}
struct S2
{
align(1):
char[2] c; //+0
uint u; //+2
}
struct S3
{
align(1) char[2] c; //+0
align(1) uint u; //+2
}
void main()
{
writeln("**** compiler ",__VENDOR__, " ", __VERSION__);
writeln;
writeln("S1.c.offsetof (should be 0) = ", S1.c.offsetof);
writeln("S1.u.offsetof (should be 2) = ", S1.u.offsetof);
writeln("S1.sizeof (should be 6) = ", S1.sizeof);
writeln;
writeln("S2.c.offsetof (should be 0) = ", S2.c.offsetof);
writeln("S2.u.offsetof (should be 2) = ", S2.u.offsetof);
writeln("S2.sizeof (should be 6) = ", S2.sizeof);
writeln;
writeln("S3.c.offsetof (should be 0) = ", S3.c.offsetof);
writeln("S3.u.offsetof (should be 2) = ", S3.u.offsetof);
writeln("S3.sizeof (should be 6) = ", S3.sizeof);
writeln;
}
Output:
**** compiler Digital Mars D 2059
S1.c.offsetof (should be 0) = 0
S1.u.offsetof (should be 2) = 2
S1.sizeof (should be 6) = 6
S2.c.offsetof (should be 0) = 0
S2.u.offsetof (should be 2) = 2
S2.sizeof (should be 6) = 6
S3.c.offsetof (should be 0) = 0
S3.u.offsetof (should be 2) = 2
S3.sizeof (should be 6) = 6
**** compiler Digital Mars D 2060
S1.c.offsetof (should be 0) = 0
S1.u.offsetof (should be 2) = 4
S1.sizeof (should be 6) = 8
S2.c.offsetof (should be 0) = 0
S2.u.offsetof (should be 2) = 2
S2.sizeof (should be 6) = 8
S3.c.offsetof (should be 0) = 0
S3.u.offsetof (should be 2) = 2
S3.sizeof (should be 6) = 8
Oct 06 2012
btw GDC and LDC 2.060 produces same output as DMD 2.060 at http://dpaste.dzfl.pl/
Oct 06 2012
http://dlang.org/changelog.html Since 2.060 behavior of align outside aggregate was changed. This explains the first example. Regarding the second one: "alignment for the fields of an aggregate doesn't affect the alignment of the aggregate itself" - from spec http://dlang.org/attribute.html#align.
Oct 06 2012
Thanx Maxim, but what about S2.sizeof (should be 6) = 8 S3.sizeof (should be 6) = 8
Oct 07 2012
On Sunday, 7 October 2012 at 10:45:40 UTC, novice2 wrote:Thanx Maxim, but what about S2.sizeof (should be 6) = 8 S3.sizeof (should be 6) = 8http://dpaste.dzfl.pl/57911897 Alignment attribute specifies members' alignment if it is inside structure and structure alignment if it is placed outside it. In case of S2 and S3 u member is placed without alignment and both structures contain 2+4 bytes, but because structures themselves are not specified with align() attribute, they are aligned to default 4 byte boundary and contain additional 2 trailing bytes. S4 is specified as having no alignment, so it's size is exactly 2+4 bytes.
Oct 07 2012
Thanx again.
Code align(1) struct ... { align(1): ... }
rescue me and return pre 2.060 behaviour
Oct 07 2012
and contain additional 2 trailing bytesBut, imho, this is "unproperly" to include something outside struct in its size.
Oct 07 2012
On Sunday, 7 October 2012 at 12:42:17 UTC, novice2 wrote:Strictly speaking, nothing special is included, just empty bytes for optimization purposes. This behavior is similar to C/C++ where structures can have internal and trailing padding.and contain additional 2 trailing bytesBut, imho, this is "unproperly" to include something outside struct in its size.
Oct 07 2012









"novice2" <sorry noem.ail> 