Подтвердить что ты не робот

Размер класса (объекта) в .NET.

Как определить, большой или малый класс в .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? Я знаю, что это странный вопрос, но я считаю, что каждая интуиция объекта ест пространство памяти.

4b9b3361

Ответ 1

Размер экземпляра класса определяется:

  • Объем данных, фактически сохраненных в экземпляре
  • Отступы, необходимые между значениями
  • Некоторые дополнительные внутренние данные, используемые управлением памятью

Итак, обычно класс, содержащий свойство строки, нуждается (в 32-битной системе):

  • 8 байт для внутренних данных
  • 4 байта для ссылки на строку
  • 4 байта неиспользуемого пространства (чтобы получить минимум 16 байт, которые может обрабатывать менеджер памяти)

И обычно для класса, содержащего свойство integer, требуется:

  • 8 байт для внутренних данных
  • 4 байта для целочисленного значения
  • 4 байта неиспользуемого пространства (чтобы получить минимум 16 байт, которые может обрабатывать менеджер памяти)

Как вы видите, свойства string и integer занимают одно и то же пространство в классе, поэтому в первом примере они будут использовать один и тот же объем памяти.

Значение свойства string, конечно, другое дело, поскольку оно может указывать на строковый объект в куче, но это отдельный объект, а не часть класса, указывающего на него.

Для более сложных классов вступает в действие дополнение. Класс, содержащий логическое и строковое свойство, например, использовал бы:

  • 8 байт для внутренних данных
  • 1 байт для логического значения
  • 3 байта заполнения, чтобы получить четную 4-байтную границу
  • 4 байта для ссылки на строку

Обратите внимание, что это примеры макетов памяти для классов. Точная компоновка варьируется в зависимости от версии фреймворка, реализации CLR и того, является ли это 32-битным или 64-битным приложением. Поскольку программа может быть запущена либо в 32-разрядной, либо в 64-разрядной системе, макет памяти даже не известен компилятору, он решил, что код JIT: ed перед выполнением.

Ответ 2

В общем, класс больше, если он имеет много экземпляров (нестатических) полей, независимо от их значения; классы имеют память не менее 12 байт, а поля со ссылочными типами - 4 байта в 32-битных системах и 8 байтов в 64-битных системах. Другие поля могут быть выложены с отступом до границ слов, так что класс с четырьмя полями byte фактически может занимать в памяти четыре раза 4 байта. Но все это зависит от времени выполнения.

Не забывайте о полях, которые могут быть скрыты, например, в ваших объявлениях автоматических свойств. Поскольку они поддерживаются полем внутри, они добавят размер этого класса:

public string MyProperty
{ get; set; }

Обратите внимание, что следующее свойство не влияет на размер класса, поскольку оно не поддерживается полем:

public bool IsValid
{ get { return true; } }

Чтобы получить представление об объеме памяти в экземпляре класса или структуры: примените атрибут [StructLayout(LayoutKind.Sequential)] к классу и вызовите Marshal.SizeOf() о типе или экземпляре.

[StructLayout(LayoutKind.Sequential)]
public class MyClass
{
    public int myField0;
    public int myField1;
}

int sizeInBytes = Marshal.SizeOf(typeof(MyClass));

Однако, поскольку среда выполнения может макет класса в памяти по своему желанию, фактическая память, используемая экземпляром, может отличаться, если вы не примените StructLayoutAttribute.

Ответ 3

В то время как следующая статья является старой (.NET 1.1), концепции ясно объясняют, что делает CLR для выделения памяти для объектов, созданных в вашем приложении; какие кучи находятся в них, где адресуются их указатели на объекты и т.д.

Сверлить внутри .NET Framework Internals, чтобы узнать, как среда CLR создает объекты выполнения

Ответ 4

Вы также можете проверить: how-much-memory-instance-of-my-class-uses. Существует простой способ проверить размер объекта после вызова конструктора.

Ответ 5

Там проект github называется dotnetex, который использует магию и показывает размер класса или объекта.

Использование прост:

GCex.SizeOf<Object>();    // size of the type
GCEx.SizeOf(someObject);  // size of the object;

Под капотом он использует магию.
Чтобы подсчитать размер типа, он переводит указатель таблицы методов во внутреннюю структуру MethodTableInfo и использует это свойство Size следующим образом:

public static unsafe Int32 SizeOf<T>()
{
    return ((MethodTableInfo *)(typeof(T).TypeHandle.Value.ToPointer()))->Size;
}

Чтобы подсчитать размер объекта, он использует истинную темную магию, которую довольно сложно получить:) Посмотрите код.

Ответ 6

Когда говорят размер класса, я бы предположил, что это означает, сколько членов класса имеет класс и насколько сложным является класс.

Однако ваш вопрос - это размер памяти, необходимый при создании экземпляра класса. Мы не можем быть настолько уверены в точном размере, потому что .Net framework сохраняет и удерживает управление базой памяти от нас (что хорошо). Даже сейчас у нас есть правильный размер, значение может быть верным навсегда. В любом случае, мы можем быть уверены, что в памяти будет записано следующее:

  • Переменная экземпляра.
  • Автоматическое свойство.

Итак, имеет смысл сказать, что класс User будет занимать больше памяти, чем класс Member.