【问题标题】:Does each object allocate memory for constants?每个对象是否为常量分配内存?
【发布时间】:2014-05-05 09:07:52
【问题描述】:

在我的代码设计中,我包含了很多常量。创建新对象时,是为该对象的常量分配内存,还是像静态变量一样永久存储在单个实例中?就内存存储而言,静态项目到底在哪里结束?

也就是说,如果我定义了 100 个对象,会不会有 100 个相同常量值的副本?

如果它们是在静态内存中定义的(无论在哪里),我希望它们是,访问它们是否需要计算机切换内存页面?不断访问常量而不是变量是否会影响性能?

谢谢

战神

【问题讨论】:

    标签: c# vb.net memory memory-management


    【解决方案1】:

    根据MSDN article

    事实上,当编译器在 C# 源代码中遇到常量标识符...时,它会将文字值直接替换为它生成的中间语言 (IL) 代码。

    因此,使用常量,如下所示:

    const int myConst = 5;
    int x = myConst;
    

    字面意思(请原谅双关语)与以下代码没有什么不同:

    int x = 5;
    

    无论哪种方式,编译器都会生成相同的输出。当程序集运行时,该值存储在堆栈中(执行方法的本地内存)。无需查找、内存页面切换、内存堆访问或其他任何操作。

    【讨论】:

      【解决方案2】:

      常量在运行时没有存储位置。在编译代码时,对常量标识符的所有访问都会导致该常量的字面值替换标识符。

      【讨论】:

      • 不,const 字符串字面量将具有对内部字符串对象的对象引用。这称为 string interning,由 CLR 应用以提高性能并减少保存所有具有相同字符序列的文字所需的内存空间。
      • @Mert 但是常量标识符并不是保存任何数据的东西。语义与在整个代码中简单地嵌入实际字符串文字相同。是的,如果启用了实习,这恰好导致字符串在实习池中,并且对代码中这些文字的所有访问都是使用对池中该字符串的硬编码引用。从const 语义的角度来看,这一切都无关紧要。这些内存都不代表该 const 标识符的存储。
      • 如果您认为所问的问题可能会被解释为错误的答案,因为如果使用 ldstr 命令推送所有字符串,那么您将受到很大的性能影响和内存消耗。想想一个程序访问 const 字符串数百万次,如果我们每次都从元数据中加载文字,那将是一个问题,对吧?
      • @Mert 如果您禁用字符串实习,这正是发生的情况。您指的是与 const-ness 概念不同的功能。数百万次访问 const 字符串与在程序中简单地嵌入相同的字符串文字数百万次没有什么不同。
      • 回答“换句话说,如果我定义 100 个对象,是否会有 100 个相同常量值的副本?”如果实习是打开的(默认情况下),那么将引用一个对象。如果没有,那么性能就会受到影响,并且您的代码会变得更大。我认为这是对所问内容的更好解释。
      猜你喜欢
      • 2020-02-11
      • 1970-01-01
      • 2019-09-05
      • 2011-06-03
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 2020-08-19
      相关资源
      最近更新 更多