如果单例没有被调用,它们会分配内存吗?

问题描述 投票:0回答:2

如果单例没有被调用,它们会分配内存吗?例如:

public class CameraShake : MonoBehaviour
{
    // Make it singleton
    #region Singleton
    public static CameraShake instance { get; private set; };
    private void Awake()
    {
        if (instance == null)
            instance = this;
    }
    #endregion
 
    public void Function() {// Code here...}
 
}

如果我们没有在某个地方调用它,它会分配内存吗?

c# performance unity-game-engine optimization singleton
2个回答
0
投票

您在这里使用的是 MonoBehaviour,而不是“真正的”单例。 “真正的”单例是在启动时(或某个初始化阶段)或在需要时使用“延迟初始化”创建的。单例也不是静态类。它的创建方式与静态类不同,因此任何有关静态类的规则都不适用于此处。 但是由于您使用的是 MonoBehaviour,您正在使用由 Unity 创建的托管对象并将对其的引用存储为静态引用。为了使这个单例存在并且使

instance

永远有效,您必须以某种方式将其添加到

GameObject
(在编辑器中或在
AddComponent<T>()
上使用
GameObject
因此,为了使对象的单例部分存在,需要事先有一个实例,然后由 Unity 调用 

Awake()

。因此,您的对象将始终分配内存,无论您是否通过静态成员访问它。如果您在应用程序生命周期中的任何时候都没有创建内存,它就不会分配内存,但这与单例方面完全无关,只是您没有在引擎中生成对象。

    


-1
投票
根据微软的文档

与所有类类型一样,.NET 运行时在加载引用该类的程序时加载静态类的类型信息。程序无法准确指定类的加载时间。但是,在程序中首次引用该类之前,可以保证加载并初始化其字段并调用其静态构造函数。
静态构造函数仅被调用一次,静态类在程序所在的应用程序域的生命周期内保留在内存中

我不是内存分配方面的专家,但这对我来说似乎很清楚。

编辑:即使在您的示例中,

CameraShake

不是静态类,我也会再次引用文档。


因此,创建静态类与创建仅包含静态成员和私有构造函数的类基本相同。私有构造函数会阻止类被实例化。使用静态类的优点是编译器可以检查以确保没有意外添加实例成员。编译器保证无法创建此类的实例。

© www.soinside.com 2019 - 2024. All rights reserved.