我想提供静态帮助函数来处理类的数据类型。我考虑将它们包含在课堂上。它们是为每个新的类实例实例化还是仅实例化一次?
答案 0 :(得分:6)
函数不是“实例化”(除非它们是函数 templates )。
实例化类,类的实例是对象。每个对象在内存中占用空间,但函数只是程序,编译器一次性生成的代码片段,并且每次实例化新对象时都不会分配内存中的空间。
函数可以隐式地处理类的实例(如果函数是成员函数),但这只是通过将隐式指针传递给它们所处理的对象来完成的。因此,即使在成员函数的情况下,无论是static
还是非 - static
,都不会增加代码片段 1 。
如果你想询问是否只为static
函数生成了一段代码,而不是几段独立的代码,那么答案就是“是”;但是,对于成员函数,答案是相同的。
1 实际上,virtual
成员函数确实需要为具有至少一个成员virtual
函数的类的每个实例存储一个额外的指针(此指针指向所谓的 vtable )。但是,static
函数不能为virtual
,因此这不适用于您在问题中考虑的情况。
答案 1 :(得分:4)
不,没有与static
成员函数关联的每实例开销。
此外,没有与任何成员函数关联的每个实例开销,但有一个例外。例外是将虚函数添加到没有任何类的类中;通常,这会为类的每个实例添加一个额外的指针。添加更多虚拟函数不会产生进一步的每个实例开销。
答案 2 :(得分:1)
成员函数(静态或其他)只会被实例化一次。在任何情况下,他们都不会给课程增加任何开销。