静态方法会降低我的开销吗?

时间:2012-05-03 00:16:41

标签: c++ memory-management static

每次创建新实例时,类是否必须为其非静态成员函数分配内存?

为了说明一点,如果我正在写一个代表3空间向量的类v3d,我会通过定义

来减少使用内存吗?

static v3d::dotProduct(v3d v1, v3d v2)

而不是

v3d::dotProduct(v3d v2)

3 个答案:

答案 0 :(得分:3)

每个实例都不存储静态或非静态成员函数。在非静态成员函数的情况下,我理解它的方式是它们被翻译成类似的东西(可能不如此):

v3d_dotProduct(v3d this, v3d v2)

相应地翻译对他们的呼叫。如果你想提高性能,我建议使用内联函数,因为它们实际上将函数内容复制到你调用它的地方。我不认为这会降低你的内存使用量,但它值得用于每秒多次调用的类函数(静态和非静态)。

http://www.cplusplus.com/forum/articles/20600/

答案 1 :(得分:2)

内存中有一个函数实例。它与静态无关。您不为成员函数分配内存。

或许我误解了。也许你的意思是函数以某种方式占用了对象中的空间?不,它没有。在目标代码级别,成员资格基本上只是名称约定和隐藏的“this”参数。如果是虚拟的,通常只有一个vtable,对于所有实例都是相同的。

但是,在您的示例中,您似乎按值传递了所有v3d对象。这意味着在静态情况下,您要制作2个对象副本(每个arg一个),而在非静态情况下,您只制作1个对象副本。

如果您通过引用传递参数,则可以避免复制 - 除非点积算法可能需要,不管是什么(自从我做任何数学以来很长时间)。

答案 2 :(得分:1)

在任何一种情况下,函数的代码在代码存储器中只有一个副本。静态函数使用相同数量的代码内存但使用较少的堆栈内存,因为在调用它们时,在堆栈上传递的参数较少。非静态类成员函数有一个额外的参数(this指针),在调用时会添加到堆栈中。如果你不在对象中使用任何需要使用“this”指针的东西,你应该将该函数声明为static。

您将保存的堆栈内存量可能微不足道。但是如果该函数每秒被调用数百万次,则静态函数可以看到速度的提高,因为不必在堆栈上传递额外的参数。