digitalmars.D.bugs - [Issue 19516] New: Alignment of members & size of structs
- d-bugmail puremagic.com (52/52) Dec 26 2018 https://issues.dlang.org/show_bug.cgi?id=19516
https://issues.dlang.org/show_bug.cgi?id=19516 Issue ID: 19516 Summary: Alignment of members & size of structs inconsistent with C Product: D Version: D2 Hardware: x86_64 OS: All Status: NEW Severity: normal Priority: P1 Component: dmd Assignee: nobody puremagic.com Reporter: bdh_bugzilla outlook.com According to the spec [1], D structs are supposed to have the same memory layout as their C counterparts. However, writing some bindings for a C library I found the following inconsistency. -- D code (see [2]) struct s { union { double d; char[20] cs; }; char b; } pragma(msg, s.b.offsetof); // Expecting 24 but getting 20 pragma(msg, s.sizeof); // Expecting 32 but getting 24 void main(){} -- In C (using clang 7 or gcc 8.1 [3]) the offset of b is 20, but 24 when using dmd/ldc [2]. The mismatching sizeof output seems to be a result of that. -- C code (see [3]) #include <stdio.h> struct S { union { double d; char cs[20]; }; char b; }; int main(){ struct S s; // Yields 24, unlike the 20 in D printf("b at: %lu\n", (void*)&s.b-(void*)&s); // Yields size 32, unlike the 24 in D printf("size of s: %lu\n", sizeof(s)); } -- [1] https://dlang.org/spec/struct.html#struct_layout [2] https://dpaste.dzfl.pl/ff55c816a940 [3] https://www.jdoodle.com/a/Sgc --
Dec 26 2018