5

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

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

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

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

6 回答 6

4

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

所有 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 代码。

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

于 2017-09-14T14:49:37.277 回答
1

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

于 2013-06-28T10:23:54.633 回答
0

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

于 2013-06-28T09:58:52.087 回答
0

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

于 2013-06-28T10:01:22.080 回答
0

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

于 2013-06-28T10:02:02.223 回答
-1

如果它是未更改的常量,则应使其成为类外部的全局变量。

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

于 2013-06-28T09:58:16.770 回答