C++中使用多态的代价

用VC开发一个数据处理项目一年多了,最近性能问题比较突出,于是想尽了办法来优化系统的内存占用。 也因此仔细研究了一下虚函数对内存的占用。理论这里就不再多说了,网上有很多相关资料,说明虚函数对内存的占用情况。这里只举一个例子,来说明一下使用C++的多态在提供好的扩展性的同时对系统开销方面带来的代价。

class CBase
{
public:
 CBase(void);
 virtual ~CBase(void);

 virtual void A() = 0;
 virtual void B() = 0;
 virtual void D() = 0;
 virtual void E() = 0;
 virtual void F() = 0;
 virtual void G() = 0;
 virtual void H() = 0;

private:
 int m_nID;
 double m_dbValue;
};

CBase::CBase(void)
{
 m_nID = 0;
 m_dbValue = 0.0;
}

CBase::~CBase(void)
{
}

class CDrive :
 public CBase
{
public:
 CDrive(void);
 virtual ~CDrive(void);

 virtual void A();
 virtual void B();
 virtual void D();
 virtual void E();
 virtual void F();
 virtual void G();
 virtual void H();
};

CDrive::CDrive(void)
{
}

CDrive::~CDrive(void)
{
}

void CDrive::A()
{

}
void CDrive::B()
{

}
void CDrive::D()
{

}
void CDrive::E()
{

}
void CDrive::F()
{

}
void CDrive::G()
{

}
void CDrive::H()
{

}

// 下面的代码采用编译时实例化(未使用多态)

 vector<CDrive> vectTemp;
 // 编译时实例化
 for (int i = 0; i < 1000000; i++)
 {
  CDrive drive;
  vectTemp.push_back(drive);
 }
 AfxMessageBox(_T("编译时实例化"));

// 上面的代码运行后,通过任务管理器发现占用47M左右的物理+虚拟内存。

// 下面的代码在运行时实例化(用到了多态)

 vector<CBase*> vectTemp;
 // 运行时实例化
 for (int i = 0; i < 1000000; i++)
 {
  CBase* pBase = new CDrive;
  vectTemp.push_back(pBase);
 }
 AfxMessageBox(_T("运行时实例化"));
 for (int i = 0; i < (int)vectTemp.size(); i++)
 {
  delete vectTemp[i];
 }


// 上面的代码运行后,通过任务管理器发现占用67M左右的物理+虚拟内存。

从上面的例子可见,大数据量的时候,较多地使用虚函数将会带来大量额外的内存开销。所以,这种情况下,还是需要根据软件的实际情况进行权衡,决定是否采用多态。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑再鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值