Re: Struct size

2014-04-19 Thread Andrej Mitrovic via Digitalmars-d-learn
On 4/19/14, Lars T. Kyllingstad via Digitalmars-d-learn
digitalmars-d-learn@puremagic.com wrote:
 Say I have two structs, defined like this:

  struct A { /* could contain whatever */ }

  struct B { A a; }

 My question is, is it now guaranteed that A.sizeof==B.sizeof?

The best thing to do is add a static assert and then you can relax:

-
struct A { }
struct B { A a; }
static assert(A.sizeof == B.sizeof);
-

As for the ABI, I don't think I've ever seen it mentioned anywhere.


Re: Struct size

2014-04-19 Thread Lars T. Kyllingstad via Digitalmars-d-learn
On Saturday, 19 April 2014 at 12:26:16 UTC, Andrej Mitrovic via 
Digitalmars-d-learn wrote:

On 4/19/14, Lars T. Kyllingstad via Digitalmars-d-learn
digitalmars-d-learn@puremagic.com wrote:

Say I have two structs, defined like this:

 struct A { /* could contain whatever */ }

 struct B { A a; }

My question is, is it now guaranteed that A.sizeof==B.sizeof?


The best thing to do is add a static assert and then you can 
relax:


That's what I've done, but it would be nice to know the code 
won't break due to some combination of platform and/or compiler 
switches I didn't think to test.  Anyway, I've played around a 
bit, and found that a combination of struct and field alignment 
*can* break my assumption:


align(1) struct A
{
char c;
align(1) int i;
}

struct B { A a; }

Now, A.sizeof is 5, while B.sizeof is 8.  I'd have to add 
align(1) to the declaration of B to fix it.