虚函数和普通类成员函数在内存中是怎样存放的?

之前一直在讨论虚函数有关的知识,但不能忘记最基本的类成员函数。
可以看下面这篇和我之前写的一篇先复习一下虚函数,虚函数表,虚继承等等
https://www.cnblogs.com/jerry19880126/p/3616999.html

然后存储区域明确一下:
C++中,
虚函数表位于只读数据段(.rodata),即:C++内存模型中的常量区;
虚函数代码则位于代码段(.text),也就是C++内存模型中的代码区;
在这里插入图片描述

只提到了虚函数的存放位置,那么类的普通成员函数呢?

有一篇好文,提到了类的静态成员函数
原文在这
它的总结:类中的虚函数是动态生成的,由虚函数表的指向进行访问,不为类的对象分配内存,就没有虚函数表就无法访问。
类中的普通函数静态生成,不为类的对象分配内存也可访问。(当然了,与static还是不一样的,文中的用法为class *b = null ;b->fun();其实还是传入了this指针,所以即便我这样说,读者也应注意它与static的不同)

另一篇文章的意思是,所有类成员函数和非成员函数代码存放在代码区;
插播一下文中的题外话:

举个例子:基类对象包含一个虚表指针,指向基类中所有虚函数的地址表。派生类对象也将包含一个虚表指针,指向派生类虚函数表。看下面两种情况:

如果派生类重写了基类的虚方法,该派生类虚函数表将保存重写的虚函数的地址,而不是基类的虚函数地址。

如果基类中的虚方法没有在派生类中重写,那么派生类将继承基类中的虚方法,而且派生类中虚函数表将保存基类中未被重写的虚函数的地址。注意,如果派生类中定义了新的虚方法,则该虚函数的地址也将被添加到派生类虚函数表中。

这里的意思是:
c++中一个类中无非有四种成员:静态数据成员和非静态数据成员,静态函数和非静态函数。

1、非静态数据成员被放在每一个对象体内作为对象专有的数据成员。

2、静态数据成员被提取出来放在程序的静态数据区内,为该类所有对象共享,因此只存在一份。

3、静态和非静态成员函数最终都被提取出来放在程序的代码段中并为该类所有对象共享,因此每一个成员函数也只能存在一份代码实体。在c++中类的成员函数都是保存在静态存储区中的 ,那静态函数也是保存在静态存储区中的,他们都是在类中保存同一个惫份。

因此,构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是this指针。
成员函数为该类所有对象共享,不仅是处于简化语言实现、节省存储的目的,而且是为了使同类对象有一致的行为。同类对象的行为虽然一致,但是操作不同的数据成员。

综合上面几篇,他们的意思基本都是:他们统统放在静态存储区即只读数据段。

最后,他们在内存中存放顺序还有待研究,这里开一个新坑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值