Макет объекта
Я хочу понять расположение объекта. Так что я выполнил с различными порядками переменных-членов. Все получилось, как и ожидалось, ожидайте следующей последовательности.
#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.
Но если я удаляю m_a из Test1, он дает ожидаемый ввод (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
Почему существует разница в 8 байтов, если я удаляю целое число, которое точно выровнено по границе 4 бита?
PS: я знаю, что это зависит от реализации. Я хочу знать, как это было сделано:). Это вошло в картину, так как я хочу получить доступ к закрытым членам, поэтому пытаюсь понять расположение объектов!!!
1 ответ
Решение
С целым числом 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
};