2013-10-14 3 views
2

Если бы мы имели такой код:Выполняют ли свойства/методы в классах пространство в памяти?

public class Enemy 
{ 
    public int hp; 
} 

Enemy Тогда объект будет принимать 4 байта в 32-битных машин, и 8 байт в 64-разрядных (поправьте меня, если я ошибаюсь).

Если мы изменим его на что-то вроде этого:

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

Как минимум - для каждого экземпляра класса требуется хотя бы один указатель на него, или это будет сбор мусора. Существует дополнительная информация о битах фреймворков, которые различаются. Объем памяти, необходимый для каждого метода, зависит от реализации. Попытка учета каждого байта, используемого на таких языках, может быть очень сложной, потому что у вас нет прямого контроля над ней. Зачем вам нужно знать? Или это просто об авто-свойствах? –

+0

Я просто хочу понять, как это работает. Я изначально просил узнать о свойствах. Но тогда, поскольку они похожи на функции, я также хотел узнать о них. – vexe

+0

'объект будет принимать 4 байта в 32-битных машинах и 8 байтов в 64-битных (исправьте меня, если я ошибаюсь)' Не уверен в этом. Независимо от того, что вы запускаете 32 бит или 64 бит, 'int' будет 4 байта, поэтому он называется' Int32'. Я думаю, вы вводите в заблуждение 'IntPtr' с' int'. Исправьте меня, если я ошибаюсь –

ответ

4

int в C# всегда будет System.Int32, который всегда будет занимать 4 байта пространства, независимо от 32-битной или 64-разрядное приложение.

Однако в объекте есть дополнительные накладные расходы. У Jon Skeet есть blogpost, который детализирует некоторые из этого здесь, Of memory and strings.

Как вы можете видеть, базовый размер объекта составляет 12 байтов при работе как 32-разрядный, даже если у вас нет полей.

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

Однако, если вы сделаете это автоматическое свойство, например:

public int Hp { get; set; } 

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

1

public int Hp { set; get; } означает AUTOgenerate переменную и ее методы доступа, поэтому эта переменная займет пространство, то же самое, что вы его вручную определяете.

больше деталей:

ваш код компилируется в любом виде двоичного кода (либо чистые машинные коды, или байт-код) - так, что ваш код всегда занимают некоторую память во время хранения на HD или во время работы в оперативной памяти , также - для каждого экземпляра любого класса во время выполнения выделяется дополнительная память для переменных этого класса, поэтому все ваши классы берут память, а классы без переменных используют почти 0 дополнительную память для каждого экземпляра, но могут быть некоторые «технические», данные для каждого экземпляра, такие как vrtbl, поэтому обычно - все классы и все объекты занимают некоторую память

+0

Спасибо за ваш ответ. – vexe

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; } 
    } 
} 

Кроме того, добавив дополнительный метод будет использовать дополнительную память, но не за экземпляр. Облик: Where are methods stored in memory?

+0

Спасибо. Но как насчет моего второго примера, где у меня есть функция и переменная, сколько памяти это займет? (Думаю, это займет ту же сумму, что и в моем третьем примере, верно?) – vexe

+0

Просто перекрестился обновленный :) –

+0

О да, я видел ваше редактирование, да, я помню, что читал это. Таким образом, код (функции) принимает одно и то же пространство, даже если у меня было множество объектов. Это имеет смысл, потому что это всего лишь код, все они его используют, поэтому он делится между объектами, которые, я думаю, правильно? – vexe

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