静态成员是否有助于内存效率?
2022-09-02 02:35:28
如果我有一个类,我希望在内存敏感型应用程序中的数千个实例中使用,那么如果将静态功能分解为静态成员,是否有帮助?
我想象静态方法和变量每个类存储一次,而对于非静态成员,必须为每个实例存储一些内容。
对于成员变量,这似乎很清楚,但是为方法存储了什么样的数据呢?
我正在使用Java,但我想一些一般规则也可以应用于其他托管环境(例如.NET)。
如果我有一个类,我希望在内存敏感型应用程序中的数千个实例中使用,那么如果将静态功能分解为静态成员,是否有帮助?
我想象静态方法和变量每个类存储一次,而对于非静态成员,必须为每个实例存储一些内容。
对于成员变量,这似乎很清楚,但是为方法存储了什么样的数据呢?
我正在使用Java,但我想一些一般规则也可以应用于其他托管环境(例如.NET)。
静态方法和幕后的非静态(实例)方法之间的唯一区别是,将额外的隐藏参数 () 传递给实例方法,并且可以使用间接调度(如果是虚拟的)调用实例方法。不占用额外的代码空间。this
编辑:
我的答案集中在方法上,但仔细阅读后,我发现问题更多地是关于静态数据的。是的,从某种意义上说,静态数据将节省内存,因为它只有一个副本。当然,数据是否应该是静态的,更多的是数据的含义或用途,而不是内存的节省。
如果您需要拥有大量对象并希望节省内存,则可能还需要调查是否适用使用“Flyweight”模式。
决定不应该以效率为由,而应以正确性为由。
如果您的变量表示每个实例的不同值,则它应该是一个实例变量。
如果变量是与类型关联的公共值,而不是该类型的单个实例,则它应为静态变量。
但是,你是对的 - 如果你有一个静态变量,你不会为每个实例“付费”。这只是增加了一个额外的理由,使变量静态,因为它们不代表对象状态的一部分。
当你在问题中提到方法时,你是在谈论局部变量吗?对于每个方法调用,你都将获得一组新的局部变量 - 包括递归调用。但是,这不会创建新的静态或实例变量集。