对象的布局

Layout of an object

本文关键字:布局 对象      更新时间:2023-10-16

我想了解对象的布局。所以我用不同顺序的成员变量执行。一切如愿以偿,期待着接下来的序列。

#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:我知道这是具体实施的。我想知道是如何实现的:)。这是因为我想访问私人成员,所以试图了解对象布局!!!

对于整数m_asizeof(Test1)为8,将m_a与4字节边界对齐。如果没有int,它只是第th个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
};