我想了解一个对象的布局。所以我用不同的成员变量命令执行。一切都按预期进行,期望按顺序进行。
#include <iostream>
using namespace std;
class Test1
{
public:
int m_a;
char m_b;
};
class Test
{
public:
int m_b;
Test1 m_t;
char m_g;
char m_c;
char m_d;
int m_e;
};
int main()
{
Test t;
cout<<(int*)(&t.m_b)<<endl;
cout<<(int*)(&t.m_t.m_a)<<endl;
cout<<(int*)(&t.m_t.m_b)<<endl;
cout<<(int*)(&t.m_c)<<endl;
cout<<(int*)(&t.m_d)<<endl;
cout<<(int*)(&t.m_e)<<endl;
cout<<sizeof(t)<<endl;
}
输出:
0xbfebbd6c
0xbfebbd70
0xbfebbd74
0xbfebbd79
0xbfebbd7a
0xbfebbd7c
20
我的预期16。
但如果我从Test1中删除m_a,它会给出预期的输入(12)。
#include <iostream>
using namespace std;
class Test1
{
public:
char m_b;
};
class Test
{
public:
int m_b;
Test1 m_t;
char m_g;
char m_c;
char m_d;
int m_e;
};
int main()
{
Test t;
cout<<(int*)(&t.m_b)<<endl;
cout<<(int*)(&t.m_t.m_b)<<endl;
cout<<(int*)(&t.m_c)<<endl;
cout<<(int*)(&t.m_d)<<endl;
cout<<(int*)(&t.m_e)<<endl;
cout<<sizeof(t)<<endl;
}
输出:
0xbf82e674
0xbf82e678
0xbf82e67a
0xbf82e67b
0xbf82e67c
12
如果我删除与4位边界完全对齐的整数,为什么存在8个字节的差异?
PS:我知道这是特定于实现的。我想知道该实现是如何完成的:)。这是因为我想访问私人成员,所以试图了解对象布局!!!
答案 0 :(得分:3)
使用整数m_a
sizeof(Test1)
为8,将m_a
与4字节边界对齐。没有int,它只是char
的大小。
class Test
{
public:
int m_b; // 4
Test1 m_t; // 12
char m_g; // 13
char m_c; // 14
char m_d; // 15
int m_e; // 20
};