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左右的物理+虚拟内存。
从上面的例子可见,大数据量的时候,较多地使用虚函数将会带来大量额外的内存开销。所以,这种情况下,还是需要根据软件的实际情况进行权衡,决定是否采用多态。
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左右的物理+虚拟内存。
从上面的例子可见,大数据量的时候,较多地使用虚函数将会带来大量额外的内存开销。所以,这种情况下,还是需要根据软件的实际情况进行权衡,决定是否采用多态。
相关文章推荐
- C++中类的多态与虚函数的使用
- C++中类的多态与虚函数的使用
- C++基础:多态和虚函数的使用
- more effective c++之Item M3:不要对数组使用多态
- 教你怎样正确使用C++的多态
- C++:类的多态与虚函数的使用
- 使用C++多态特性时常遇的问题
- C++中类的多态和虚函数的使用
- C/C++问答(3):关于构造和析构函数使用多态
- 第05章 CORE C++_对象的创建和使用_继承_多态_析构_xxx_cast_友元_只读成员_静态成员_多重继承_虚继承_内部类
- C++之不要对数组使用多态(3)---《More Effective C++》
- C++中类的多态与虚函数的使用
- c++ - 如何使用抽象和多态
- C++多态必须使用指针或者引用,直接传对象就变成切片
- 《more effective c++》Item M3:不要对数组使用多态
- c++中什么是多态,继承中的using使用
- C++中类的多态与虚函数的使用
- C++中类的多态与虚函数的使用
- 不使用virtual关键字实现C++多态
- C++ 虚函数使用注意点 与 多态的关系