静态成员是否有助于记忆效率?

如果我有一个类,我希望在一个内存敏感的应用程序中使用数千个实例,如果我将静态功能列入静态成员,是否有帮助?

我认为静态方法和变量每个类存储一次,而对于非静态成员则必须为每个实例存储一些内容。

对于成员变量,似乎很清楚,但是为方法存储了哪种数据?

我正在使用Java,但我想象一些通用规则也适用于其他托管环境(如.NET)。


静态方法和幕后非静态(实例)方法之间唯一的区别是一个额外的隐藏参数( this )被传递给实例方法,并且该实例方法可能使用间接调度(如果是虚拟的)被调用。 没有额外的代码空间。

编辑:


我的答案专注于方法,但仔细阅读,我发现问题更多的是关于静态数据。 是的,静态数据在某种意义上可以节省内存,因为它只有一个副本。 当然,数据是否应该是静态的更多是数据含义或使用的功能,而不是内存节省。

如果您需要拥有大量对象并且希望节省内存,则可能还需要调查是否使用“Flyweight”模式。


不应该以效率为由作出决定 - 应该以正确性为理由。

如果你的变量为每个实例表示一个不同的值,它应该是一个实例变量。

如果你的变量是一个与类型相关的公共值,而不是一个单独的类型实例,它应该是一个静态变量。

然而,你是正确的,如果你有一个静态变量,那么你不会为每个实例“付费”。 这只是增加了一个额外的原因,使得变量不会代表对象状态的一部分。

当你在你的问题中提到方法时,你在谈论局部变量吗? 您将为每个方法调用获取一组新的局部变量 - 包括递归调用。 但是,这不会创建一组新的静态或实例变量。


简单的答案是肯定的。 每次创建实例时都没有等于重新创建整个对象,静态方法和变量通常会消耗更少的内存,具体取决于它们的使用方式。 当然,如果你只需要在整个程序中创建一个实例,那没有什么区别。 并且请记住,您始终可以将实例作为参考传递给不带静态对象的位置,并且需要重用它们。

链接地址: http://www.djcxy.com/p/82873.html

上一篇: Do static members help memory efficiency?

下一篇: Where are static variables stored in java?