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}
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

关注「CoderPro」公众号,专注于分享.NET/C++知识及算法的大本营,新手公众号请大家多多关照/(ㄒoㄒ)/~~
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值