2013-04-05 29 views
3

我想提供静态帮助函数来处理类的数据类型。我考虑将它们包括在课程中。他们会被实例化为每个新的类实例还是一次?静态成员函数是否增加了类的开销?

+3

“实例化”静态方法和实例方法都不是。你所想的没有任何开销。 – 2013-04-05 15:43:48

+0

@MikeWeller。谢谢。 – danijar 2013-04-05 15:44:26

+1

开销来自初始化静态成员,在程序运行之前需要为所有静态对象发生。 – dtech 2013-04-05 15:47:18

回答

6

函数没有“实例化”(除非它们是函数模板)。

被实例化,并且类的实例是对象。每个对象都占用内存中的空间,但函数只是过程,编译器一次性或全部生成的代码片段,并且每次实例化新对象时都不会分配它们在内存中的空间。

函数可以隐式地在类的实例上工作(如果函数是成员函数),但这只是通过将隐式指针传递给它们工作的对象来完成的。因此,即使在成员函数的情况下,它们是static或非static,也没有代码片段的增加。

如果你的意思是问是否只有一条代码为static功能,而不是代码的几个独立的部分生产,那么答案是“”;但是对于成员函数来说,答案也是一样的。

实际上,virtual成员函数确实需要存储额外的指针,其具有至少一个成员virtual函数的类的每个实例(该指针将指向所谓虚函数表)。但是,static函数不能是virtual,所以这不适用于您在问题中考虑的情况。

1

成员函数(静态或其他)只能实例化一次。在任何情况下,他们都不会给课堂增加任何开销。

+0

'虚拟'做。也许只有第一个。 – zch 2013-04-05 15:42:40

+0

@zch他们没有。有一个vtable添加一个指针,但单个成员函数以及vtable只存在一次,它们的数量和大小与实例的大小没有关系。是的,本来可以提到的,但我没有看到它远程证明downvote(+1反击)。 – delnan 2013-04-05 15:43:59

+0

即使是虚拟函数也只是“实例化”一次。 – john 2013-04-05 15:44:01

4

不,不存在与static成员函数相关的每个实例的开销。

此外,没有每个实例的开销与任何成员函数关联,但有一个例外。例外是向一个没有任何类的类添加一个虚函数;通常,这会为该类的每个实例添加一个额外的指针。添加更多的虚拟功能不会产生更多的每个实例的开销。

+1

通过将虚拟函数添加到以前没有任何类的虚拟函数中,通常会将指针添加到该类型对象的数据中。 – 2013-04-05 15:59:16

+0

@PeteBecker:很好,谢谢! – NPE 2013-04-05 16:09:58