如果我们有这样的代码:
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() { }
}
有人可以解释一下吗?
答案 0 :(得分:4)
int
始终为System.Int32
,总是占用4个字节的空间。
但是,对象中还有额外的开销。 Jon Skeet有一篇博文,详细介绍了其中的一些内容,Of memory and strings。
如您所见,即使没有字段,当以32位运行时,对象的基本大小为12个字节。
然而,你是对的,因为具有代码的属性不一定会增加对象的大小。
但是,如果你把它变成一个自动属性,就像这样:
public int Hp { get; set; }
然后编译器将自动为您创建一个支持字段,以保存该属性的值,这将再次占用空间。
答案 1 :(得分:1)
public int Hp { set; get; }
表示 - AUTO生成变量及其访问方法,因此该变量占用空间,与手动定义相同。
更多详情:
您的代码被编译成任何类型的二进制代码(纯机器代码或字节代码) - 因此,您的代码在HD存储期间或在RAM中运行期间总是占用一些内存,对于每个实例class,在运行期间为这个类的变量分配额外的内存,所以你的所有类都占用内存,没有变量的类为每个实例使用几乎0的额外内存,但是每个实例都可以有一些“技术”数据,比如vrtbl,通常 - 所有类和所有对象都需要一些内存
答案 2 :(得分: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 。 看:Where are methods stored in memory?