虚函数对数据结构内存的影响

写代码已经四、五年了,现在慢慢的开始非常注意代码的高质量和高效率了,其实有时候我们在写代码的时候很少考虑到虚函数对内存造成的影响,甚至有些非常简单的数据结构增加接口的时候也增加虚接口。一旦类之间的继承关系存在虚接口,那么就意味着多态的发生,也就意味着虚函数表的产生,虚函数表用来记录派生关系的子类应有的调用关系,以及说明其应该调用哪个函数。既然有了虚函数表就需要额外的内存开销了。那么我们看下如下的demo,看看虚函数的增加会对内存有多大的影响。

#include <iostream>

class Base{
public:
	void doIt(){
		std::cout<<"do from base"<<std::endl;
	};
};

class Derived : public Base
{
public:
	void doIt(){
		std::cout<<"do from derived"<<std::endl;
	};
};

int _tmain(int argc, _TCHAR* argv[])
{
	int sb = sizeof(Base);
	int sd = sizeof(Derived);

	Base b1;
	Derived d1;

	b1.doIt();
	d1.doIt();

	char c = getchar();
	return 0;
}

上例中,如果类中没有任何成员,Base和Derived均只占1个字节,如果给Base类的doIt接口加上virtual关键字,重新执行,能看出sb和sd均为4个字节,这是因为增加了虚函数表,(虚函数表指针占4个字节,以最大字节对齐,则占用4个字节大小)。若是编译的64为程序应该会是8个字节,因为64位的指针大小为8个字节。所以能看出我们在设计类的时候如果能省掉virtual则尽量不用,这样可以最大程序上节省程序内存的开销。




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
虚函数(virtual function)是用于实现多态的一种机制,它允许通过基类的指针或引用调用派生类的方法。 虚函数的原理: 在C++中,虚函数的实现原理是通过虚函数表(vtable)和虚函数指针(vptr)来实现的。 1. 虚函数表(vtable):每个包含虚函数的类都有一个虚函数表,其中存储了该类所有虚函数的地址。虚函数表是一个静态的数据结构,它在编译时生成并与类的类型相关联。每个类只有一个对应的虚函数表。 2. 虚函数指针(vptr):每个对象在内存中都有一个隐藏的指针,称为虚函数指针(vptr),它指向该对象所属类的虚函数表。虚函数指针存在于对象的内存布局中,但是对于程序员是透明的,无法直接访问。 当通过基类指针或引用调用虚函数时,编译器根据对象的实际类型来确定调用哪个派生类的方法。这个过程主要依靠虚函数指针和虚函数表来实现: 1. 使用基类指针或引用调用虚函数时,编译器根据指针或引用的静态类型(基类类型)找到虚函数表的地址。 2. 通过虚函数表的地址,可以访问到虚函数表,根据偏移量找到对应的虚函数地址。 3. 最终,通过虚函数地址调用相应的派生类的虚函数。 需要注意的是,虚函数的调用是在运行时动态决定的,而不是在编译时确定的。这样可以实现多态性,让程序能够根据对象的实际类型来调用相应的函数。 总的来说,虚函数通过虚函数表和虚函数指针来实现动态绑定,使得通过基类指针或引用调用虚函数时能够根据对象的实际类型来确定调用哪个派生类的方法,实现多态性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值