我想提供静态帮助函数来处理类的数据类型。我考虑将它们包括在课程中。他们会被实例化为每个新的类实例还是一次?静态成员函数是否增加了类的开销?
回答
函数没有“实例化”(除非它们是函数模板)。
类被实例化,并且类的实例是对象。每个对象都占用内存中的空间,但函数只是过程,编译器一次性或全部生成的代码片段,并且每次实例化新对象时都不会分配它们在内存中的空间。
函数可以隐式地在类的实例上工作(如果函数是成员函数),但这只是通过将隐式指针传递给它们工作的对象来完成的。因此,即使在成员函数的情况下,它们是static
或非static
,也没有代码片段的增加。
如果你的意思是问是否只有一条代码为static
功能,而不是代码的几个独立的部分生产,那么答案是“是”;但是对于成员函数来说,答案也是一样的。
实际上,virtual
成员函数确实需要存储额外的指针,其具有至少一个成员virtual
函数的类的每个实例(该指针将指向所谓虚函数表)。但是,static
函数不能是virtual
,所以这不适用于您在问题中考虑的情况。
不,不存在与static
成员函数相关的每个实例的开销。
此外,没有每个实例的开销与任何成员函数关联,但有一个例外。例外是向一个没有任何类的类添加一个虚函数;通常,这会为该类的每个实例添加一个额外的指针。添加更多的虚拟功能不会产生更多的每个实例的开销。
通过将虚拟函数添加到以前没有任何类的虚拟函数中,通常会将指针添加到该类型对象的数据中。 – 2013-04-05 15:59:16
@PeteBecker:很好,谢谢! – NPE 2013-04-05 16:09:58
- 1. 函子到静态成员函数和静态成员函数的类型
- 2. C++派生类是否可以继承基类的静态数据成员和静态成员函数?
- 3. 构造函数调用两次静态类成员的增量
- 4. '静态'的C++类成员函数?
- 5. 静态函数访问类的成员
- 6. 静态成员数组成员函数
- 7. _beginthreadex静态成员函数
- 8. Const静态成员函数
- 9. 非静态成员函数
- 10. 什么是非静态成员函数?
- 11. 静态线程函数访问非静态类成员在C++
- 12. 静态类成员
- 13. 静态成员函数指针保存非静态成员函数
- 14. 如何从静态成员函数中调用非静态成员函数?
- 15. 静态非模板成员函数与静态模板成员函数
- 16. 一个类的非静态成员函数的函数指针
- 17. 静态成员函数是否可重入?
- 18. 非静态类的静态成员?
- 19. 静态函数常量静态成员函数
- 20. Python中的函数的静态成员?
- 21. 使用静态成员函数而不是等效的非静态成员函数的优点?
- 22. C++ - 派生类是否继承基类的静态成员?
- 23. 类的静态成员
- 24. C++类的静态成员
- 25. C++类的静态成员
- 26. 导出静态库的成员函数
- 27. 如何从类成员函数内部访问静态函数?
- 28. PHP - 动态地获得在静态成员函数的类名
- 29. 静态成员是否被继承?
- 30. 静态成员是否可以超载?
“实例化”静态方法和实例方法都不是。你所想的没有任何开销。 – 2013-04-05 15:43:48
@MikeWeller。谢谢。 – danijar 2013-04-05 15:44:26
开销来自初始化静态成员,在程序运行之前需要为所有静态对象发生。 – dtech 2013-04-05 15:47:18