c# - Static 和 Const 字段的内存消耗

标签 c#

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

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

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

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

最佳答案

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

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

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

关于c# - Static 和 Const 字段的内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17361931/

相关文章:

c# - 如何获取特定的套接字并关闭它

c# - RavenDB 索引 : Need a solution to merge 2 dictionary fields into a single dictionary, 将其展平并使其可搜索

c# - Entity Framework Core 与 WPF Core - 无法添加迁移

c# - 将新行添加到表后如何更新 datagridview 的行列表

c# - 通过引用另一个表从一个表获取值

c# - 添加控件以从ViewModel查看

c# - 无法将字符串从托管 c# 传递到非托管 c

c# - MVC4 捆绑误导背景图像 url

c# - 导出到 Excel 在 SSL (https) 下的 IE 上不起作用

c# - Expand 在查询中做了什么?