您的位置:首页 > 编程语言 > C语言/C++

C++中使用多态的代价

2006-12-06 15:34 218 查看
用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左右的物理+虚拟内存。

从上面的例子可见,大数据量的时候,较多地使用虚函数将会带来大量额外的内存开销。所以,这种情况下,还是需要根据软件的实际情况进行权衡,决定是否采用多态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息