【问题标题】:memory for unassigned variables in C#C#中未分配变量的内存
【发布时间】:2015-04-05 11:22:40
【问题描述】:
//Consider this declaration
string name;

这里的字符串变量name是一个未赋值的变量,如果没有初始化,这个声明是否为name保留任何内存?

【问题讨论】:

  • 如果它没有在任何地方使用它可能会被编译器剥离
  • 这通常是声明变量的作用,但如果它从未使用过,编译器可能会将其优化掉。
  • 是类字段还是局部变量?答案因您使用代码的地方而异。
  • 使用 ILSpy,我可以确认 string name;string name = "Test"; 已针对 DEBUG 和 RELEASE 构建进行了优化,如果它们没有在方法中的其他地方使用。
  • @JasonEvans 不一定。如果它是private 并且从未从类中读取,则编译器实际上可以确定它未​​被使用。或者如果该字段是 internal 并且从未在程序集中的任何地方访问过。如果它是公开的,那么它就需要在那里。

标签: c# variables memory memory-management unassigned-variable


【解决方案1】:

它不是未分配的。所有类/结构都接收它们的默认值。对于字符串,它是null

如果它是一个局部变量,那么优化将倾向于删除它。如果它是一个实例变量,那么将分配内存(我认为,C# 规范不清楚)。

【讨论】:

  • 为什么你说“它不是未分配的”。如果它是一个局部变量并且如果我尝试对名称进行任何操作,编译器会显示“使用未分配的变量”。
  • @ShamseerKSmr 它的错误是完全正确的;您不能使用未分配的变量。你需要先给它赋值。
【解决方案2】:

方法的局部变量不保留任何内存,寄存器分配给它取决于它的使用方式和其他变量的使用方式。只要不被使用,就不会分配寄存器。

您可以在一个方法中包含大量变量,但您的 CPU 中的寄存器数量有限,因此编译器会优化您的代码以重用寄存器。如需更多信息,请参阅Register allocation

不,string name;保留任何内存。

【讨论】:

  • 局部变量可以被注册,也可能不被注册。说本地人从不消耗内存是非常错误的。事实上,在大多数程序中,相当大比例的局部变量最终会在内存中花费至少 一些 时间。
  • 它们不保留任何内存(暗示何时不使用)。
  • 将为局部变量分配堆栈空间,最终将保留内存。如果编译器因为未使用而对其进行了优化,那么在运行时将根本不存在变量(甚至不存在寄存器)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
相关资源
最近更新 更多