C++ 类内存结构

Posted CoderPro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 类内存结构相关的知识,希望对你有一定的参考价值。

1. 测试环境

  1. VS 2019

  2. 修改项目属性 C/C++ -> 命令行 -> "/d1 reportAllClassLayout"

2. 成员变量

代码示例:

// 成员变量
class Test0
{

    int m_is0;
};

1>class Test0    size(4):
1>    +---
1> 0    | m_is0
1>    +---

3. 虚函数

代码示例:

1>class Test1    size(8):
1>    +---
1> 0    | 
{vfptr}
14    | m_is
1>    +---
1>Test1::$vftable@:
1>    | &Test1_meta
1>    |  0
10    | &Test1::virtual_fun
11    | &Test1::virtual_fun1
1>Test1::virtual_fun this adjustor: 0
1>Test1::virtual_fun1 this adjustor: 0

4. 成员函数

代码示例:

// 成员变量 + 虚函数 + 成员函数
class Test2
{

public:
    int m_is;
    virtual void virtual_fun();
    virtual void virtual_fun1();

    int member_fun() return m_is; }
};
// 成员函数:将成员函数提取出来放在代码区,编译成员函数时要额外添加一个参数,把当前对象的指针传递进去,通过指针来访问成员变量
// 编译后的成员函数大概如下所示
//int Test2_member_fun(Test2* pThis) {
//    return pThis->m_is;
//}
1>class Test2    size(8):
1>    +---
1> 0    | 
{vfptr}
14    | m_is
1>    +---
1>Test2::$vftable@:
1>    | &Test2_meta
1>    |  0
10    | &Test2::virtual_fun
11    | &Test2::virtual_fun1
1>Test2::virtual_fun this adjustor: 0
1>Test2::virtual_fun1 this adjustor: 0

成员函数再编译后会生成一个单独的函数但会多一个参数,参数为该类的指针,成员函数编译后会存储到代码存储区

5. 静态成员变量与静态成员函数

代码示例:

// 成员变量 + 虚函数 + 成员函数 + 静态成员变量 + 静态成员函数
class Test3
{

public:
    int m_is;
    virtual void virtual_fun() {}
    virtual void virtual_fun1() {}

    int member_fun() return m_is; }

    static int static_sis;
    static int static_func();
};

1>class Test3    size(8):
1>    +---
1> 0    | 
{vfptr}
14    | m_is
1>    +---
1>Test3::$vftable@:
1>    | &Test3_meta
1>    |  0
10    | &Test3::virtual_fun
11    | &Test3::virtual_fun1
1>Test3::virtual_fun this adjustor: 0
1>Test3::virtual_fun1 this adjustor: 0

6. 类继承

代码示例:

// 类继承
class Test4 : public Test2
{
public:
    int m_is;
    virtual void virtual_fun0() {}
};
// 此时类的大小为12,两个类共用一个虚函数表
1>class Test4    size(12):
1>    +---
1> 0    | +--- (base class Test2)
1> 0    | | 
{vfptr}
14    | | m_is
1>    | +---
18    | m_is
1>    +---
1>Test4::$vftable@:
1>    | &Test4_meta
1>    |  0
10    | &Test2::virtual_fun
11    | &Test2::virtual_fun1
12    | &Test4::virtual_fun0
1>Test4::virtual_fun0 this adjustor: 0



以上是关于C++ 类内存结构的主要内容,如果未能解决你的问题,请参考以下文章

C++ 类内存模型和对齐

C++ - 指针和“智能指针”

C++类内存分布

C++类内存分布

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

C++ 内存对齐