Tail pad optimization, cache friendlyness and C++ interrop
Remo via Digitalmars-d
digitalmars-d at puremagic.com
Wed Jun 11 06:56:37 PDT 2014
On Wednesday, 11 June 2014 at 07:22:51 UTC, deadalnix wrote:
> On Wednesday, 11 June 2014 at 06:30:26 UTC, Walter Bright wrote:
>> On 6/10/2014 11:11 PM, deadalnix wrote:
>>> On Wednesday, 11 June 2014 at 04:11:53 UTC, Walter Bright
>>> wrote:
>>>> Hmm, this could have serious problems with the following:
>>>>
>>>> S1 s1;
>>>> S2 s2;
>>>> s2.c = 3;
>>>> memcpy(&s2.s1, &s1, sizeof(S1)); // Oops! stomped on s2.c
>>>
>>> Yes, that is why they do it only in specific condition (ie
>>> when the thing use
>>> C++ specific feature and not C one).
>>
>> I don't understand - didn't you say this was expressible as C
>> structs? Aren't those supposed to be compatible with C?
>>
>>
>
> struct S1 {
> int a;
> private:
> char b;
> };
>
> struct S2 : S1 {
> char c;
> };
>
> S2 is 8 bytes. If you remove private in S1, then S2 becomes 12
> bytes. S1 is not a "C" struct anymore and do not need to follow
> the standard layout.
This is pretty strange behavior.
At least on Windows I can not confirm this.
Visual Studio 2013, Intel Compiler and Clang for windows have the
same consistent behavior here.
private do NOT affect struct size.
But there is a parameter in Visual Studio that will affect it
called "Struct Member Alignment"
http://msdn.microsoft.com/en-us/library/xh3e3fd0.aspx
1 Byte (/Zp1) sizeof(S1)=5, sizeof(S2)=6
2 Byte (/Zp2) sizeof(S1)=6, sizeof(S2)=8
4 Byte (/Zp4) sizeof(S1)=8, sizeof(S2)=12
8 Byte (/Zp8) sizeof(S1)=8, sizeof(S2)=12 this is the default.
Of course the same can be done with #pragma pack(?) .
There is also __declspec(align(?)) and in C++11 alignas(?) but
its behavior is different from #pragma pack(?) .
More information about the Digitalmars-d
mailing list