静态成员函数会给类增加一个开销

Do static member functions add an overhead to the class?

本文关键字:一个 开销 增加 函数 静态成员      更新时间:2023-10-16

我想提供静态辅助函数来处理类的数据类型。我考虑过把它们纳入课程本身。它们会为每个新类实例实例化还是只实例化一次?

函数不是"实例化"的(除非它们是函数模板)。

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

函数可以隐式地作用于类的实例(如果函数是成员函数),但这只需通过传递指向它们所作用对象的隐式指针即可完成。因此,即使在成员函数的情况下,无论是static还是非static,也不会出现代码片段1的增殖。

如果你想问是否只有一段代码是为static函数产生的,而不是几个单独的代码,那么答案是"";但是对于成员函数,答案也是一样的。

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

不,没有static成员函数相关的每个实例开销。

此外,除了一个例外,任何成员函数都没有与相关的每个实例开销。例外是将虚函数添加到没有虚函数的类中;通常,这将为类的每个实例添加一个额外的指针。添加更多的虚函数不会增加每个实例的额外开销。

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