Thread overview | |||||
---|---|---|---|---|---|
|
April 19, 2014 Struct size | ||||
---|---|---|---|---|
| ||||
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, regardless of how A is defined (member variable types, alignment, etc.)? More to the point, say I have a function foo() which looks like this: extern(C) void foo(A* ptr, size_t len); Is it now guaranteed that I can safely pass it a pointer to an array of Bs? That is, auto arr = new B[10]; foo(cast(A*) arr.ptr, arr.length); Thanks, Lars |
April 19, 2014 Re: Struct size | ||||
---|---|---|---|---|
| ||||
Posted in reply to Lars T. Kyllingstad | 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. |
April 19, 2014 Re: Struct size | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | 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.
|
Copyright © 1999-2021 by the D Language Foundation