gpt4 book ai didi

c# - .NET 中类(对象)的大小

转载 作者:搜寻专家 更新时间:2023-11-01 03:49:36 26 4
gpt4 key购买 nike

如何确定 .NET 中的类是大类还是小类?它是根据属性或字段的数量、属性/字段的数据类型来衡量的吗?或返回类型的方法?它的方法的参数?其方法的访问修饰符,虚拟方法?谢谢..

 class A
{

string x { get; set; }
}

class B
{
int x { get; set; }
}

在这个例子中,如果我像这样实例化类 A 和 B

 A objA = new A();
B objB = new B();

类 objA 是否更大,因为它包含一个 String 属性而 objB 仅包含一个 Int?尽管我没有为它的属性设置任何值。谢谢

编辑:只是为了澄清我的问题

假设我有一个类

public class Member
{
public string MainEmpId { get; set; }
public string EmpId { get; set; }
}

还有一个类

public class User
{
public string AccessLevel { get; set; }
public string DateActivated { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Mi { get; set; }
public string Password { get; set; }
public string UserId { get; set; }
public string UserName { get; set; }
public string Active { get; set; }
public string ProviderName { get; set; }
public string ContactPerson { get; set; }
public string Relation { get; set; }
public string Landline { get; set; }
public string MobileNo { get; set; }
public string Complaint { get; set; }
public string Remarks { get; set; }
public string Reason { get; set; }
public string RoomType { get; set; }
}

如果我像这样实例化它

  Member A = new Member();
User B = new User()

物体A比物体B大吗?我知道这是一个奇怪的问题,但我相信对象的每个实例化都会占用内存空间..

最佳答案

类实例的大小由以下因素决定:

  • 实例实际存储的数据量
  • 值之间所需的填充
  • 内存管理使用的一些额外的内部数据

因此,通常一个包含字符串属性的类需要(在 32 位系统上):

  • 8 个字节用于内部数据
  • 4 个字节用于字符串引用
  • 4 字节未使用空间(达到内存管理器可以处理的最小 16 字节)

通常包含整数属性的类需要:

  • 8 个字节用于内部数据
  • 4 个字节的整数值
  • 4 字节未使用空间(达到内存管理器可以处理的最小 16 字节)

如您所见,字符串和整数属性在类中占用相同的空间,因此在您的第一个示例中,它们将使用相同数量的内存。

字符串属性的值当然是另一回事,因为它可能指向堆上的字符串对象,但这是一个单独的对象,而不是指向它的类的一部分。

对于更复杂的类,填充开始发挥作用。例如,包含 bool 值和字符串属性的类将使用:

  • 8 个字节用于内部数据
  • 1 个字节用于 bool 值
  • 3 字节的填充以达到偶数 4 字节的边界
  • 4 个字节用于字符串引用

请注意,这些是类的内存布局示例。确切的布局因框架的版本、CLR 的实现以及它是 32 位还是 64 位应用程序而异。由于程序可以在 32 位或 64 位系统上运行,因此编译器甚至不知道内存布局,它决定了代码在执行前何时进行 JIT:ed。

关于c# - .NET 中类(对象)的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32032549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com