2009-11-21 3 views
2

Я новичок в программировании на C#.Основы C# - Управление памятью

Может ли кто-нибудь сказать мне, что управление памятью о C#?

Class Student 
{ 

    int Id; 
    String Name; 
    Double Marks; 

    public string getStudentName() 
    { 
     return this.Name; 
    } 

    public double getPersantage() 
    { 
     return this.Marks * 100/500; 
    } 
} 

Я хочу знать, сколько памяти выделено, например, для этого класса?

Как насчет методов? Где они выделены?

И если есть статические методы, как их хранить?

Может кто-нибудь коротко объяснить это мне?

+0

Хорошим инструментом для понимания сборщика мусора является профилировщик CLR. –

ответ

5

Экземпляр класса сама по себе будет занимать 24 байта на 32-битной CLR:

  • 8 байт накладных расходов объекта (блок синхронизации и тип указателя)
  • 4 байта для Int
  • 4 байта для строки ссылки
  • 8 байт для двойной

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

Методы не несут такой же размер штрафа за хранение - это поля. По существу, они связаны с типом , а не с экземпляром типа, но есть версия IL и JIT-скомпилированный код. Однако, как правило, вы можете игнорировать это в моем опыте. Вы должны иметь большой объем кода и очень мало экземпляров для памяти, занимаемой кодом, чтобы быть значительным по сравнению с данными. Важно то, что вы не получаете отдельную копию каждого метода для каждого экземпляра.

РЕДАКТИРОВАТЬ: Обратите внимание, что вам удалось выбрать относительно простой корпус. В ситуациях, когда у вас есть поля с логически меньшими размерами (например, short или byte), CLR выбирает, как выложить объект в памяти, так что значения, требующие выравнивания по памяти (находящиеся на границе слова), выложены соответствующим образом, но, возможно, поддержка других - так что 4 байтовых поля может в конечном итоге взять 4 байта, или они могут принять 16, если CLR решает выровнять каждый из них по отдельности. I думаю, это специфично для реализации, но возможно, что спецификация CLI определяет точный подход.

+0

Правильно! В 64-битной архитектуре вы получаете 64-битную ссылку на строку. – munissor

+1

Jon Skeet, я понимаю, что на этой доске ваши слова обычно заслуживают цитирования в качестве источника, поэтому это не вызов для этого. Не могли бы вы предоставить документ, в котором вы читаете, или как вы обнаружили эту информацию (а именно объект oeverhead bullet). Благодарю. –

+0

@munissor: Да, и я считаю, что накладные расходы объекта больше, но я не знаю, составляет ли это 12 байт или 16. –

0

Как, я думаю, Джон Скит говорит, что это зависит от множества факторов и нелегко измерить загодя. Необходимо учитывать такие факторы, как работа на 64-битной ОС или 32-битной ОС, и запускаете ли вы отладочную версию или версию выпуска. Объем памяти, занимаемой кодом, зависит от процессора, скомпилированного JITTER, поскольку различные процессоры могут использоваться для разных процессоров.

0

Не совсем ответ, просто для удовольствия.

struct Student 
{ 
    int Id; 
    [MarshalAs(UnmanagedType.LPStr)] 
    String Name; 
    Double Marks; 
    public string getStudentName() 
    { 
     return this.Name; 
    }  
    public double getPersantage() 
    { 
     return this.Marks * 100/500; 
    } 
} 

И

 Console.WriteLine(Marshal.SizeOf(typeof(Student))); 

На 64-битной возвращения:

 24 

А на 32 бита:

 16 
0
sizeof(getPersantage()); 

хороший способ узнать байты для него. не слишком havent сделано много C#, но лучше с ответом, чем нет ответа: =)

+0

Это недопустимо синтаксис C# ... –

Смежные вопросы