静态成员函数会给类增加一个开销
Do static member functions add an overhead to the class?
我想提供静态辅助函数来处理类的数据类型。我考虑过把它们纳入课程本身。它们会为每个新类实例实例化还是只实例化一次?
函数不是"实例化"的(除非它们是函数模板)。
类被实例化,类的实例是对象。每个对象都占用内存空间,但函数只是过程,是编译器一次性生成的代码片段,并不是每次实例化新对象时都为它们分配内存空间。
函数可以隐式地作用于类的实例(如果函数是成员函数),但这只需通过传递指向它们所作用对象的隐式指针即可完成。因此,即使在成员函数的情况下,无论是static
还是非static
,也不会出现代码片段1的增殖。
如果你想问是否只有一段代码是为static
函数产生的,而不是几个单独的代码,那么答案是"是";但是对于成员函数,答案也是一样的。
1实际上,virtual
成员函数确实需要为至少有一个virtual
成员函数的类的每个实例存储一个额外的指针(该指针将指向所谓的vtable)。但是,static
函数不能是virtual
,所以这不适用于您在问题中考虑的情况。
不,没有static
成员函数相关的每个实例开销。
成员函数(静态或其他)只实例化一次。它们在任何情况下都不会给类增加任何开销。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?
- 虚拟继承的性能开销(如果只有一个基具有数据成员)
- 当类层次结构中只有一个类时,请避免在每个功能呼叫上读取V-Table的开销
- 在Linux中用C++实现一个低开销的间隔定时器
- 当“虚拟”是一个相当大的开销时,有什么经验法则吗
- 在另一个类中定义复杂(大尺寸)的类是否有任何开销
- 静态成员函数会给类增加一个开销