The following code generates a different layout in memory on MSVC vs clang/gcc. Why?
#include <stdio.h>
#pragma pack(push,1)
struct empty_struct
{
};
class derived_struct : public empty_struct
{
int m_derivedMember;
};
class derived_struct_container : public empty_struct
{
public:
derived_struct m_ds;
};
class foo
{
public:
foo() {}
derived_struct_container m_dsc;
int m_foo_member;
};
#pragma pack(pop)
int main()
{
foo fb;
printf("pf->m_dsc offset: %ld\n", (char *)&fb.m_dsc - (char *)&fb);
printf("pf->m_dsc.m_ds offset: %ld\n", (char *)&(fb.m_dsc.m_ds) - (char *)&fb);
printf("pf->m_foo_member offset: %ld\n", (char *)&(fb.m_foo_member) - (char *)&fb);
return 0;
}
The output on MSVC x64 is:
fb.m_dsc offset: 0
fb.m_dsc.m_ds offset: 0
fb.m_foo_member offset: 4
The output on clang x64 under Linux is:
fb.m_dsc offset: 0
fb.m_dsc.m_ds offset: 1
fb.m_foo_member offset: 5
How would I get the clang layout to match the MSVC layout?