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