静态成员函数是否增加了类的开销?
函数没有“实例化”(除非它们是函数模板)。
类被实例化,并且类的实例是对象。每个对象都占用内存中的空间,但函数只是过程,编译器一次性或全部生成的代码片段,并且每次实例化新对象时都不会分配它们在内存中的空间。
函数可以隐式地在类的实例上工作(如果函数是成员函数),但这只是通过将隐式指针传递给它们工作的对象来完成的。因此,即使在成员函数的情况下,它们是static
或非static
,也没有代码片段的增加。
如果你的意思是问是否只有一条代码为static
功能,而不是代码的几个独立的部分生产,那么答案是“是”;但是对于成员函数来说,答案也是一样的。
实际上,virtual
成员函数确实需要存储额外的指针,其具有至少一个成员virtual
函数的类的每个实例(该指针将指向所谓虚函数表)。但是,static
函数不能是virtual
,所以这不适用于您在问题中考虑的情况。
不,不存在与static
成员函数相关的每个实例的开销。
此外,没有每个实例的开销与任何成员函数关联,但有一个例外。例外是向一个没有任何类的类添加一个虚函数;通常,这会为该类的每个实例添加一个额外的指针。添加更多的虚拟功能不会产生更多的每个实例的开销。
通过将虚拟函数添加到以前没有任何类的虚拟函数中,通常会将指针添加到该类型对象的数据中。 – 2013-04-05 15:59:16
@PeteBecker:很好,谢谢! – NPE 2013-04-05 16:09:58
“实例化”静态方法和实例方法都不是。你所想的没有任何开销。 – 2013-04-05 15:43:48
@MikeWeller。谢谢。 – danijar 2013-04-05 15:44:26
开销来自初始化静态成员,在程序运行之前需要为所有静态对象发生。 – dtech 2013-04-05 15:47:18