3

如果我们有这样的代码:

public class Enemy
{
   public int hp;
}

然后一个Enemy对象在 32 位机器中需要 4 个字节,在 64 位机器中需要 8 个字节(如果我错了,请纠正我)。

如果我们把它改成这样:

public class Enemy
{
   public int hp;
   public void Attack() {}
}

一个Enemy对象仍然会像以前一样占用相同数量的内存,对吧?

这也是一样的:

public class Enemy
{
   private int hp;
   public int Hp { get { return hp; } set { hp = value; } }
}

据我所知,属性是函数,但被视为变量,对吧?

所以如果我们这样做:

public class Enemy
{
   public int Hp { set; get; }
}

这是否意味着,一个Enemy对象现在根本不占用内存空间?这没有任何意义。

甚至这个,就此而言:

public class Enemy
{
   public void DoSomething() { }
}

有人可以解释一下吗?

4

3 回答 3

5

int在 C# 中总是会System.Int32占用 4 个字节的空间,无论是 32 位还是 64 位应用程序。

但是,对象中有额外的开销。Jon Skeet 有一篇博文详细介绍了这里的一些内容,关于内存和字符串

如您所见,当以 32 位运行时,对象的基本大小为 12 字节,即使您没有字段也是如此。

但是,您是对的,具有代码的属性不一定会增加对象的大小。

但是,如果您将其设为自动属性,如下所示:

public int Hp { get; set; }

然后编译器将自动为您创建一个支持字段来保存该属性的值,这将再次占用空间。

于 2013-10-14T08:02:24.067 回答
2

public int Hp { set; get; }意思是 - AUTOgenerate 变量,以及它的访问方法,所以这个变量会占用空间,就像你手动定义它一样。

更多细节:

您的代码被编译成任何类型的二进制代码(纯机器代码或字节代码) - 因此,您的代码在存储在 HD 上或在 RAM 中运行期间总是占用一些内存,而且 - 对于任何类的每个实例,在为此类的变量分配运行时额外内存,因此所有类都占用内存,没有变量的类为每个实例使用几乎 0 额外内存,但每个实例可能有一些“技术”数据,如 vrtbl,所以通常 -所有类和所有对象都占用一些内存

于 2013-10-14T07:47:02.243 回答
1

public int Hp { set; get; }是一个自动实现的属性,一个私有字段将在编译时生成。

喜欢:

public class Enemy
{
   public int Hp { set; get; }
}

将被执行为。

public class Enemy
{
   private int _hp;

   public int Hp 
   { 
       get { return _hp; }
       set { _hp = value; }
   }
}

另外添加额外的方法将使用额外的内存,但不是per-instance。看:方法存储在内存中的什么位置?

于 2013-10-14T07:51:23.227 回答