静态和Const字段的内存消耗

时间:2013-06-28 09:53:05

标签: c#

我有一个类,我有一个字符串字段。此字符串字段是常量,将来会在资源文件中移动,但暂时它将保留在我们的类中。现在的情况是我正在制作这个类的超过数百个对象。所以我的问题是在哪种方法中会消耗更少的内存以及为什么?

  1. 我应该创建我的字符串变量static

    public class MyClass
    {
        public static string MyString = "My String";
    }
    
  2. 我应该创建我的字符串变量const

     public class MyClass
     {
        public const string MyString = "My String";
     }
    

6 个答案:

答案 0 :(得分:1)

我相信在记忆方面没有任何区别。在两种方式中,消耗的内存都是相同的。但是性能可能会有所不同 - constant字段会更好,因为在我看来,您并不希望MyString的值被更改&常量成员是在编译时定义,并且不能在运行时更改。

答案 1 :(得分:1)

有区别。静态变量在动态内存空间中初始化,因此占用额外的内存空间,更不用说需要可执行代码(附加内存)来初始化它们并访问它们。

所有const数据与可执行代码(只读存储器(ROM))位于相同的存储空间中,其中静态数据被加载到动态存储器中,您可以在其中读取和写入。现在这里是有趣的部分,似乎在以前的答案中被忽略了。静态数据占用动态内存空间但需要额外的ROM空间,在更糟糕的情况下,可能占用两倍的内存量。请考虑以下事项:

class StaticData
{
    static string s_static1 = "My string data";
}

class ConstData
{
    const string CONST1 = "My string data";
}

类StaticData具有变量s_static1,它将占用单个指针的动态内存空间(通常为1个整数)。但是它也必须初始化,因此必须存在ROM代码来初始化它。字符串数据本身通常位于ROM空间中,因为字符串数据是不可变的,并且不会占用比常量例子更多的空间。

对于ConstData类,只需要ROM存储空间,因此在大多数情况下,这是内存的最佳使用。

现在,当您考虑编译器如何使用数据时,它会变得更有趣。除字符串/字符数据外,常量通常直接在引用的代码中替换。换句话说,根据使用情况,常量值直接加载到寄存器中或压入堆栈。在静态变量的情况下,编译器必须通过附加代码(指针引用)从内存中读取该值,因此需要额外的ROM代码。

总之,静态代码将占用更多内存,占用额外的动态内存空间以及取消引用它所需的额外可执行代码空间。

答案 2 :(得分:0)

记忆方面没有差异。无论哪种方式,您都会将字符串加载到内存中一次(如果它的值尚未存在)。当谈到字符串时,性能方面也应该没有太大的区别,正如KooKiz所指出的那样(会有价值类型,但通常你不应该关心这种微优化)

答案 3 :(得分:0)

常量不消耗任何内存。它将在编译时替换为定义的值。 将member定义为static将根据数据类型消耗内存。

答案 4 :(得分:0)

两个选项都将使用相同数量的内存。唯一的区别是第一个允许更改MyString的值而第二个不允许,这可能是你想要的。

答案 5 :(得分:-1)

如果它是一个未改变的常量,你应该使它成为类外的全局。

否则,如果必须是网站的一部分,请将其设为静态:)