Макет объекта

Я хочу понять расположение объекта. Так что я выполнил с различными порядками переменных-членов. Все получилось, как и ожидалось, ожидайте следующей последовательности.

#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_asizeof(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
};
Другие вопросы по тегам