C++ 类内存结构
Posted CoderPro
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 类内存结构相关的知识,希望对你有一定的参考价值。
1. 测试环境
VS 2019
修改项目属性 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}
1> 4 | m_is
1> +---
1>Test1::$vftable@:
1> | &Test1_meta
1> | 0
1> 0 | &Test1::virtual_fun
1> 1 | &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}
1> 4 | m_is
1> +---
1>Test2::$vftable@:
1> | &Test2_meta
1> | 0
1> 0 | &Test2::virtual_fun
1> 1 | &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}
1> 4 | m_is
1> +---
1>Test3::$vftable@:
1> | &Test3_meta
1> | 0
1> 0 | &Test3::virtual_fun
1> 1 | &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}
1> 4 | | m_is
1> | +---
1> 8 | m_is
1> +---
1>Test4::$vftable@:
1> | &Test4_meta
1> | 0
1> 0 | &Test2::virtual_fun
1> 1 | &Test2::virtual_fun1
1> 2 | &Test4::virtual_fun0
1>Test4::virtual_fun0 this adjustor: 0
以上是关于C++ 类内存结构的主要内容,如果未能解决你的问题,请参考以下文章