静态成员函数会给类增加额外开销吗?

3
我希望为处理类的数据类型提供静态助手函数。我考虑在类本身中包含它们。它们会为每个新类实例实例化还是只实例化一次?

3
静态方法和实例方法都不会被"实例化"。就你所想的意义而言,这里没有额外开销。 - Mike Weller
1
开销来自于初始化静态成员,这需要在程序运行之前为所有静态对象发生。 - dtech
3个回答

6
函数不会被“实例化”(除非它们是函数模板)。类被实例化,类的实例是对象。每个对象都占用内存空间,但函数只是一些过程,编译器一次性生成的代码片段,所以在实例化新对象时不需要为它们分配内存空间。函数可以隐式地在一个类的实例上工作(如果该函数是成员函数),但这只是通过传递指向它们工作的对象的隐式指针来完成的。因此,即使是成员函数(无论是静态的还是非静态的),也没有代码片段的增殖。如果你想问的是是否只为静态函数产生一段代码,而不是几个独立的代码片段,那么答案是“是”,但对于成员函数来说,答案也是一样的。实际上,虚拟成员函数确实需要为至少有一个成员虚拟函数的每个类的实例存储一个额外的指针(这个指针将指向所谓的v表)。但是,静态函数不能是虚拟的,因此这不适用于你在问题中考虑的情况。

4

不,与 static 成员函数没有关联的每个实例都没有额外的开销。

此外,与任何成员函数都没有每个实例的开销,只有一种例外。这个例外是向一个原本没有虚函数的类添加虚函数; 通常情况下,这会为该类的每个实例添加一个额外的指针。添加更多虚函数将不会产生进一步的每个实例开销。


1
在这里需要说明的是,如果给一个之前没有虚函数的类添加一个虚函数,通常会在该类型的对象数据中添加一个指针。 - Pete Becker

1

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


虚拟函数的作用。也许只有第一个。 - zch
@zch 不会。拥有虚函数表会增加一个指针,但是各个成员函数以及虚函数表只存在一次,它们的数量和大小不会影响实例的大小。是的,我本可以提到这一点,但我认为这并不能成为负分的理由(+1 抵消)。 - user395760
即使是虚函数,也只会被“实例化”一次。 - john
函数不被实例化。类被实例化,结构体被实例化,原始类型被实例化。但是函数不会被实例化。 - dtech
@delnan,我同意。我只是指出添加函数可能会影响对象的大小。我不认为这个答案应该被踩。 - zch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接