3

我想提供静态辅助函数来处理类的数据类型。我考虑将它们包括在课堂上。它们会为每个新的类实例实例化还是只实例化一次?

4

3 回答 3

6

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

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

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

如果您要问是否只为static函数生成一段代码,而不是几段单独的代码,那么答案是“”;但是对于成员函数,答案还是一样的。

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

于 2013-04-05T15:43:37.843 回答
4

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

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

于 2013-04-05T15:41:27.217 回答
1

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

于 2013-04-05T15:41:20.560 回答